UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ReverseIterate.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "HAL/Platform.h"
6#include <iterator>
7
11template <typename T>
13{
14 // This iterator type only supports the minimal functionality needed to support
15 // C++ ranged-for syntax. For example, it does not provide post-increment ++ nor ==.
16
27 : Ptr(InPtr)
28 {
29 }
30
31 constexpr inline T& operator*() const
32 {
33 return *(Ptr - 1);
34 }
35
37 {
38 --Ptr;
39 return *this;
40 }
41
42 constexpr inline bool operator!=(const TReversePointerIterator& Rhs) const
43 {
44 return Ptr != Rhs.Ptr;
45 }
46
47private:
48 T* Ptr;
49};
50
51namespace UE::Core::Private
52{
53 template <typename RangeType>
54 struct TReverseIterationAdapter
55 {
56 constexpr explicit TReverseIterationAdapter(RangeType& InRange UE_LIFETIMEBOUND)
57 : Range(InRange)
58 {
59 }
60
61 TReverseIterationAdapter(TReverseIterationAdapter&&) = delete;
62 TReverseIterationAdapter& operator=(TReverseIterationAdapter&&) = delete;
63 TReverseIterationAdapter& operator=(const TReverseIterationAdapter&) = delete;
64 TReverseIterationAdapter(const TReverseIterationAdapter&) = delete;
65 ~TReverseIterationAdapter() = default;
66
67 UE_FORCEINLINE_HINT constexpr auto begin() const UE_LIFETIMEBOUND
68 {
69 using std::rbegin;
70 return rbegin(Range);
71 }
72
73 UE_FORCEINLINE_HINT constexpr auto end() const UE_LIFETIMEBOUND
74 {
75 using std::rend;
76 return rend(Range);
77 }
78
79 private:
80 RangeType& Range;
81 };
82
83 template <typename ElementType, std::size_t N>
84 struct TReverseIterationAdapter<ElementType(&)[N]>
85 {
86 constexpr explicit TReverseIterationAdapter(ElementType* InArray UE_LIFETIMEBOUND)
87 : Array(InArray)
88 {
89 }
90
91 TReverseIterationAdapter(TReverseIterationAdapter&&) = delete;
92 TReverseIterationAdapter& operator=(TReverseIterationAdapter&&) = delete;
93 TReverseIterationAdapter& operator=(const TReverseIterationAdapter&) = delete;
94 TReverseIterationAdapter(const TReverseIterationAdapter&) = delete;
95 ~TReverseIterationAdapter() = default;
96
98 {
100 }
101
103 {
105 }
106
107 private:
108 ElementType* Array;
109 };
110}
111
135template <typename RangeType>
136inline constexpr UE::Core::Private::TReverseIterationAdapter<RangeType> ReverseIterate(RangeType&& Range UE_LIFETIMEBOUND)
137{
138 return UE::Core::Private::TReverseIterationAdapter<RangeType>(Range);
139}
#define UE_LIFETIMEBOUND
Definition Platform.h:812
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr UE::Core::Private::TReverseIterationAdapter< RangeType > ReverseIterate(RangeType &&Range UE_LIFETIMEBOUND)
Definition ReverseIterate.h:136
@ Range
Definition EnvQueryTypes.h:81
implementation
Definition PlayInEditorLoadingScope.h:8
FORCEINLINE FStridedReferenceIterator begin(FStridedReferenceView View)
Definition FastReferenceCollector.h:490
FORCEINLINE FStridedReferenceIterator end(FStridedReferenceView View)
Definition FastReferenceCollector.h:491
Definition ReverseIterate.h:13
constexpr bool operator!=(const TReversePointerIterator &Rhs) const
Definition ReverseIterate.h:42
constexpr T & operator*() const
Definition ReverseIterate.h:31
constexpr TReversePointerIterator & operator++()
Definition ReverseIterate.h:36
constexpr TReversePointerIterator(T *InPtr UE_LIFETIMEBOUND)
Definition ReverseIterate.h:26