20 template<
typename T>
requires concepts::gettable<T>
23 auto convert = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
25 return std::make_tuple( std::get<IDX>(std::forward<T>(t))... );
28 return convert(std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>{});
34 template<
typename T>
requires concepts::gettable<T>
45 template<
typename... ARGS>
48 return std::tuple< ARGS... >( std::forward<ARGS>(
args)... );
60 template<
typename... ARGS>
63 auto deref = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
65 return std::make_tuple( std::remove_cvref_t<ARGS>( std::get<IDX>(tup) )... );
68 return deref(std::make_index_sequence<
sizeof...(ARGS)>{});
72 template<
typename T>
requires is_tuple_v<T>
80 template<
typename... Ts>
81 using tuple_cat_t =
decltype( std::tuple_cat( std::declval<Ts>()... ) );
90 template<
size_t START,
size_t COUNT,
typename TUP>
requires is_tuple_v<TUP> && ((START+COUNT) <= std::tuple_size_v<std::decay_t<TUP>>)
94 if constexpr (COUNT == 0)
return std::tuple<>{};
100 auto extract = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
102 return std::tuple<std::tuple_element_t<START+IDX, std::decay_t<TUP>>...>(std::get<START+IDX>(std::forward<TUP>(tup))...);
105 return extract(std::make_index_sequence<COUNT>{});
112 template<
size_t START,
size_t COUNT,
typename TUP>
requires is_tuple_v<TUP> && ((START+COUNT) <= std::tuple_size_v<std::decay_t<TUP>>)
125 if constexpr (!is_tuple_v<std::decay_t<T>>) {
return std::forward_as_tuple(t); }
130 auto flatten = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
132 return std::tuple_cat( (
tuple_flatten( std::get<IDX>(std::forward<T>(t)) ))... );
135 return flatten(std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>{});
152 auto add_const = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
154 return std::tuple< bbm::add_const_t<std::tuple_element_t<IDX, std::decay_t<T>>>... >( std::get<IDX>(std::forward<T>(t))... );
157 return add_const(std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>{});
170 auto cast = []<
typename V>(V&& val) ->
decltype(
auto)
172 if constexpr (std::is_pointer_v<V> || std::is_reference_v<V>)
return const_cast<bbm::remove_const_t<V>>(std::forward<V>(val));
173 else return std::forward<V>(val);
176 auto remove_const = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
178 return std::tuple< bbm::remove_const_t<std::tuple_element_t<IDX, std::decay_t<T>>>... >( cast(std::get<IDX>(std::forward<T>(t)))... );
181 return remove_const(std::make_index_sequence<std::tuple_size_v<std::decay_t<T>>>{});
200 template<
typename... Ts>
201 std::ostream&
operator<<(std::ostream& s,
const std::tuple<Ts...>& tup)
206 if constexpr (idx != 0) s <<
", ";
209 if constexpr (
bbm::is_string_type_v< std::tuple_element_t<idx, std::tuple<Ts...>> >) s << std::string(
"\"") + std::get<idx>(tup) + std::string(
"\"");
212 else s << std::get<idx>(tup);
#define CONSTFOR(IDX, NUMITR,...)
HELPER MACRO.
Definition: constfor.h:63
Definition: aggregatebsdf.h:29
constexpr auto tuple_remove_const(T &&t)
tuple_remove_const from each element
Definition: tuple.h:168
decltype(subtuple< START, COUNT >(std::declval< TUP >())) subtuple_t
subtuple type
Definition: tuple.h:113
decltype(tuple_add_const(std::declval< std::decay_t< T > >())) tuple_add_const_t
tuple_add_const type
Definition: tuple.h:162
constexpr auto tuple_flatten(T &&t)
Recursively flatten a tuple.
Definition: tuple.h:122
constexpr auto make_ref_tuple(ARGS &&... args)
Make a tuple of references.
Definition: tuple.h:46
decltype(tuple_remove_const(std::declval< std::decay_t< T > >())) tuple_remove_const_t
tuple_remove_const type
Definition: tuple.h:186
typename remove_const< T >::type remove_const_t
Definition: type_traits.h:60
decltype(value_copy_tuple(std::declval< std::decay_t< T > >())) value_copy_tuple_t
value-copy type of a tuple.
Definition: tuple.h:73
constexpr auto tuple_add_const(T &&t)
tuple_add_const to each element
Definition: tuple.h:150
constexpr bool is_string_type_v
Definition: type_traits.h:105
constexpr auto subtuple(TUP &&tup)
subtuple
Definition: tuple.h:91
decltype(to_tuple(std::declval< T >())) to_tuple_t
type of converting a type that supports std::get to a tuple
Definition: tuple.h:35
auto to_tuple(T &&t)
Create a tuple from any other type that supports std::get.
Definition: tuple.h:21
constexpr auto value_copy_tuple(const std::tuple< ARGS... > &tup)
Value-copy a tuple.
Definition: tuple.h:61
decltype(std::tuple_cat(std::declval< Ts >()...)) tuple_cat_t
tuple_cat_t
Definition: tuple.h:81
decltype(tuple_flatten(std::declval< std::decay_t< T > >())) tuple_flatten_t
flattened tuple type
Definition: tuple.h:143
Definition: type_traits.h:30
Definition: type_traits.h:48
std::ostream & operator<<(std::ostream &s, const std::tuple< Ts... > &tup)
print a tuple
Definition: tuple.h:201
Forward declaration.
Definition: args.h:248