14#include "CoreMinimal.h"
18#include "range/v3/all.hpp"
29 template <
typename T,
size_t S>
35 template <
class I,
class S, std::ranges::subrange_kind K>
41 template <
class I,
class S, ranges::subrange_kind K>
47 template <
typename... Args>
48 constexpr bool TIsStdTuple<std::tuple<Args...>> =
true;
53 template <
typename... Args>
54 constexpr bool TIsStdPair<std::pair<Args...>> =
true;
59 template <
typename... Args>
65 template <
typename... Args>
66 constexpr bool TIsRangeV3Pair<ranges::common_pair<Args...>> =
true;
87 template <
typename T,
typename... Args>
89 CConvertibleToDecayed<T, TTuple<Args...>>
90 || CConvertibleToDecayed<T, std::tuple<Args...>>
91 || CConvertibleToDecayed<T, ranges::common_tuple<Args...>>
100 template <
typename T>
103 template <
size_t I, CStdTupleLike T>
106 return std::get<I>(Forward<T>(tuple));
109 template <
size_t I, CRangeV3TupleLike T>
110 decltype(
auto)
GetItem(T&& tuple)
112 return ranges::get<I>(Forward<T>(tuple));
115 template <
size_t I, CUnrealTuple T>
116 decltype(
auto)
GetItem(T&& tuple)
118 return tuple.template Get<I>();
121 template <CStdOrRangeV3Tuple T>
124 return std::tuple_size_v<std::decay_t<T>>;
127 template <CUnrealTuple T>
130 return TTupleArity<std::decay_t<T>>::Value;
136 template <
size_t,
typename>
139 template <
size_t I, CStdOrRangeV3Tuple T>
142 using Type = std::tuple_element_t<I, T>;
145 template <
size_t I, CUnrealTuple T>
148 using Type =
typename TTupleElement<I, T>::Type;
151 template <
size_t I, CTuple T>
154 template <
size_t I, CTuple T>
160 template <
typename Tuple,
size_t... Indices>
161 using TComposeFrom = TTuple<typename TTupleElement<Indices, Tuple>::Type...>;
163 template <
size_t Count,
typename Tuple>
164 requires (TTupleArity<Tuple>::Value >= Count)
167 template <
size_t... Indices>
171 Compose(std::make_index_sequence<TTupleArity<Tuple>::Value - Count>{})
176 template <
size_t Count,
typename Tuple>
179 template <
size_t Count,
typename Tuple>
180 requires (TTupleArity<Tuple>::Value >= Count)
183 template <
size_t... Indices>
187 Compose(std::make_index_sequence<TTupleArity<Tuple>::Value - Count>{})
192 template <
size_t Count,
typename Tuple>
195 template <
size_t Count,
typename Tuple>
196 requires (TTupleArity<Tuple>::Value >= Count)
199 template <
size_t... Indices>
203 Compose(std::make_index_sequence<Count>{})
208 template <
size_t Count,
typename Tuple>
213 template <
typename T,
typename RestTuple,
size_t... Indices>
214 auto Prepend_Impl(T&& left, RestTuple
const& right, std::index_sequence<Indices...>&&)
216 return TTuple<T, typename TTupleElement<Indices, RestTuple>::Type...>(
217 Forward<T>(left), right.template Get<Indices>()...
214 auto Prepend_Impl(T&& left, RestTuple
const& right, std::index_sequence<Indices...>&&) {
…}
221 template <
typename T,
typename RestTuple,
size_t... Indices>
222 auto Append_Impl(T&& right, RestTuple
const& left, std::index_sequence<Indices...>&&)
224 return TTuple<typename TTupleElement<Indices, RestTuple>::Type..., T>(
225 left.template Get<Indices>()..., Forward<T>(right)
222 auto Append_Impl(T&& right, RestTuple
const& left, std::index_sequence<Indices...>&&) {
…}
231 template <
typename T,
typename... Rest>
232 TTuple<T, Rest...>
operator >> (T&& left, TTuple<Rest...>
const& right)
238 template <
typename T,
typename... Rest>
239 TTuple<Rest..., T>
operator << (TTuple<Rest...>
const& left, T&& right)
232 TTuple<T, Rest...>
operator >> (T&& left, TTuple<Rest...>
const& right) {
…}
This header exists because STL headers in Android doesn't define STL concepts (other than same_as whi...
Use this header and Start.h in tandem to include third-party library headers which may not tolerate U...
Use this header and End.h in tandem to include third-party library headers which may not tolerate Unr...
auto Append_Impl(T &&right, RestTuple const &left, std::index_sequence< Indices... > &&)
auto Prepend_Impl(T &&left, RestTuple const &right, std::index_sequence< Indices... > &&)
Templating utilities for manipulating TTuples.
constexpr bool TIsStdArray
typename TTake_Struct< Count, Tuple >::Type TTake
Take only the first Count elements of the input tuple.
typename TSkip_Struct< Count, Tuple >::Type TSkip
Skip the first Count elements of the input tuple.
TTuple< Rest..., T > operator<<(TTuple< Rest... > const &left, T &&right)
Append a value to a tuple.
TTuple< typename TTupleElement< Indices, Tuple >::Type... > TComposeFrom
Compose one tuple out of the elements of another tuple based on the input index parameter pack.
decltype(auto) GetItem(T &&tuple)
std::decay_t< typename TTypeAt_Struct< I, T >::Type > TTypeAtDecayed
constexpr bool TIsRangeV3Pair
typename TTrimEnd_Struct< Count, Tuple >::Type TTrimEnd
Disregard the last Count elements of the input tuple.
constexpr bool TIsStdSubRange
constexpr bool TIsRangeV3SubRange
constexpr bool TIsStdPair
consteval size_t GetSize()
typename TTypeAt_Struct< I, T >::Type TTypeAt
constexpr bool TIsRangeV3Tuple
constexpr bool TIsStdTuple
TTuple< T, Rest... > operator>>(T &&left, TTuple< Rest... > const &right)
Prepend a value to a tuple.
std::make_index_sequence< GetSize< T >()> TIndexSequenceForTuple
static consteval TComposeFrom< Tuple,(Indices+Count)... > Compose(std::index_sequence< Indices... > &&)
decltype( Compose(std::make_index_sequence< TTupleArity< Tuple >::Value - Count >{})) Type
static consteval TComposeFrom< Tuple, Indices... > Compose(std::index_sequence< Indices... > &&)
decltype( Compose(std::make_index_sequence< Count >{})) Type
static consteval TComposeFrom< Tuple, Indices... > Compose(std::index_sequence< Indices... > &&)
decltype( Compose(std::make_index_sequence< TTupleArity< Tuple >::Value - Count >{})) Type
std::tuple_element_t< I, T > Type