14#include "CoreMinimal.h"
19#include "range/v3/all.hpp"
31 template <
typename T,
size_t S>
37 template <
class I,
class S, std::ranges::subrange_kind K>
43 template <
class I,
class S, ranges::subrange_kind K>
49 template <
typename... Args>
50 constexpr bool TIsStdTuple<std::tuple<Args...>> =
true;
55 template <
typename... Args>
56 constexpr bool TIsStdPair<std::pair<Args...>> =
true;
61 template <
typename... Args>
67 template <
typename... Args>
68 constexpr bool TIsRangeV3Pair<ranges::common_pair<Args...>> =
true;
89 template <
typename T,
typename... Args>
91 CConvertibleToDecayed<T, TTuple<Args...>>
92 || CConvertibleToDecayed<T, std::tuple<Args...>>
93 || CConvertibleToDecayed<T, ranges::common_tuple<Args...>>
102 template <
typename T>
105 template <
size_t I, CStdTupleLike T>
108 return std::get<I>(
FWD(tuple));
111 template <
size_t I, CRangeV3TupleLike T>
112 decltype(
auto)
GetItem(T&& tuple)
114 return ranges::get<I>(
FWD(tuple));
117 template <
size_t I, CUnrealTuple T>
118 decltype(
auto)
GetItem(T&& tuple)
120 return FWD(tuple).template Get<I>();
123 template <CStdOrRangeV3Tuple T>
126 return std::tuple_size_v<std::decay_t<T>>;
129 template <CUnrealTuple T>
132 return TTupleArity<std::decay_t<T>>::Value;
138 template <
size_t,
typename>
141 template <
size_t I, CStdOrRangeV3Tuple T>
144 using Type = std::tuple_element_t<I, T>;
147 template <
size_t I, CUnrealTuple T>
153 template <
size_t I, CTuple T>
156 template <
size_t I, CTuple T>
162 template <
typename Tuple,
size_t... Indices>
163 using TComposeFrom = TTuple<typename TTupleElement<Indices, Tuple>::Type...>;
165 template <
size_t Count,
typename Tuple>
166 requires (TTupleArity<Tuple>::Value >= Count)
169 template <
size_t... Indices>
173 Compose(std::make_index_sequence<TTupleArity<Tuple>::Value - Count>{})
178 template <
size_t Count,
typename Tuple>
181 template <
size_t Count,
typename Tuple>
182 requires (TTupleArity<Tuple>::Value >= Count)
185 template <
size_t... Indices>
189 Compose(std::make_index_sequence<TTupleArity<Tuple>::Value - Count>{})
194 template <
size_t Count,
typename Tuple>
197 template <
size_t Count,
typename Tuple>
198 requires (TTupleArity<Tuple>::Value >= Count)
201 template <
size_t... Indices>
205 Compose(std::make_index_sequence<Count>{})
210 template <
size_t Count,
typename Tuple>
215 template <
typename T,
typename RestTuple,
size_t... Indices>
216 auto Prepend_Impl(T&& left, RestTuple
const& right, std::index_sequence<Indices...>&&)
218 return TTuple<T, typename TTupleElement<Indices, RestTuple>::Type...>(
219 FWD(left), right.template Get<Indices>()...
223 template <
typename T,
typename RestTuple,
size_t... Indices>
224 auto Append_Impl(T&& right, RestTuple
const& left, std::index_sequence<Indices...>&&)
226 return TTuple<typename TTupleElement<Indices, RestTuple>::Type..., T>(
227 left.template Get<Indices>()...,
FWD(right)
233 template <
typename T,
typename... Rest>
234 TTuple<T, Rest...>
operator >> (T&& left, TTuple<Rest...>
const& right)
240 template <
typename T,
typename... Rest>
241 TTuple<Rest..., T>
operator << (TTuple<Rest...>
const& left, T&& 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...
#define FWD(...)
Shorten forwarding expression with this macro so one may not need to specify explicit type.
Use this header and End.h in tandem to include third-party library headers which may not tolerate Unr...
This namespace provides templating utilities and introspection into template instantiations.
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