24 #ifndef PS_ASTROTYPES_MULTIARRAY_TYPETRAITS_H
25 #define PS_ASTROTYPES_MULTIARRAY_TYPETRAITS_H
26 #include <type_traits>
29 #include <type_traits>
33 namespace astrotypes {
38 template<
typename T1,
typename T2,
typename... Ts>
46 template<
typename T1,
typename T2>
70 template<
typename T,
typename Dimension>
83 template<
typename T,
typename Dimension,
typename... Dimensions>
84 struct has_dimensions :
public logical_and<typename has_dimension<T, Dimension>::type, typename has_dimensions<T, Dimensions...>::type>
88 template<
typename T,
typename Dimension>
106 template<
typename T,
typename... Dimensions>
114 template<
typename T1,
typename T2,
typename... Ts>
115 struct list_has_type :
public std::conditional<std::is_same<T1, T2>::value || list_has_type<T1, Ts...>::value, std::true_type, std::false_type>::type
122 template<
typename T1,
typename T2>
129 template<
typename Tuple,
typename T2>
133 template<
typename T,
typename... Ts>
137 template<
typename T,
typename T2,
typename... Ts>
141 template<
typename T1,
typename T2,
typename... Ts>
146 template<
typename T1,
typename T2>
158 template<
typename Tuple,
typename T2>
161 template<
typename T,
typename... Ts>
164 static const std::size_t value = 0;
167 template<
typename T,
typename T2,
typename... Ts>
170 static const std::size_t value = 1 +
find_type<std::tuple<Ts...>, T>::value;
182 template<
typename Tuple,
typename T,
typename... Ts>
185 template<
typename... TupleTs,
typename T1,
typename T2,
typename... Ts>
189 static void exec(std::tuple<TupleTs...>& tuple, T1
const& value, T2
const& value2, Ts
const&... values)
191 insert_type<std::tuple<TupleTs...>, T1>::exec(tuple, value);
192 insert_type<std::tuple<TupleTs...>, T2, Ts...>::exec(tuple, value2, values...);
196 template<
typename... TupleTs,
typename T>
200 static void exec(std::tuple<TupleTs...>& tuple, T
const& value)
202 static_assert(
has_type<std::tuple<TupleTs...>, T>::value,
"Type does not exist in tuple");
203 std::get<
find_type<std::tuple<TupleTs...>, T>::value>(tuple) = value;
207 template<
typename... TupleTs,
typename... Ts>
210 insert_type<std::tuple<TupleTs...>,
typename std::remove_reference<Ts>::type...>::exec(tuple, values...);
219 template<typename Tuple, typename SrcTuple, std::size_t Index=std::tuple_size<SrcTuple>::value>
225 insert_type<Tuple,
typename std::tuple_element<Index-1, SrcTuple>::type>::exec(tuple, std::get<Index-1>(src_tuple));
229 template<
typename Tuple,
typename SrcTuple>
235 template<
typename... TupleTs,
typename... Ts>
236 void tuple_copy(std::tuple<TupleTs...>
const& src_tuple, std::tuple<Ts...>& dst_tuple)
238 tuple_copy_helper<std::tuple<Ts...>, std::tuple<TupleTs...>>(dst_tuple, src_tuple);
245 template<
typename Tuple1,
typename Tuple2s>
248 template<
typename... Tuple1s>
251 typedef std::tuple<Tuple1s...>
type;
254 template<
typename... Tuple1s,
typename T,
typename... Tuple2s>
257 typedef typename unique_tuple<
typename std::conditional<
has_type<std::tuple<Tuple1s...>, T>::value
258 , std::tuple<Tuple1s...>, std::tuple<Tuple1s..., T>>
::type
268 template<
typename Tuple1,
typename Tuple2>
274 type
exec(Tuple1
const& tuple1, Tuple2
const& tuple2)
283 template<
typename Tuple1,
typename Tuple2>
284 typename merge_tuples_type<Tuple1, Tuple2>::type
293 template<
typename Tuple1,
typename... Tuples>
296 template<
typename... Tuple1,
typename... Tuple2>
299 typedef std::tuple<Tuple1..., Tuple2...>
type;
302 template<
typename... Tuple1,
typename... Tuple2,
typename... Tuples>
311 template<
typename Tuple1,
typename Tuple2>
314 template<
typename T,
typename... Tuple2>
317 typedef typename std::conditional<
has_type<std::tuple<Tuple2...>, T>::value,
322 template<
typename T,
typename... Tuple1,
typename... Tuple2>
326 typedef tuple_diff<std::tuple<Tuple1...>, std::tuple<Tuple2...>>
Next;
329 typedef typename std::conditional<
has_type<std::tuple<Tuple2...>, T>::value,
337 #endif // PS_ASTROTYPES_MULTIARRAY_TYPETRAITS_H
std::conditional< has_type< std::tuple< Tuple2...>, T >::value, typename Next::type, typename join_tuples< std::tuple< T >, typename Next::type >::type >::type type
insert values into a tuple
produces a tuple type with params form all provided Tuples
unique_tuple< Tuple1, Tuple2 >::type type
void tuple_insert_type(std::tuple< TupleTs...> &tuple, Ts const &...values)
static type exec(Tuple1 const &tuple1, Tuple2 const &tuple2)
produces an extended tuple type with params form all provided tuples All types must be unique...
static void exec(std::tuple< TupleTs...> &tuple, T const &value)
helper class to perform a logical and on all the arguments
std::tuple< Tuple1..., Tuple2...> type
tuple_copy_helper(Tuple &, SrcTuple const &)
join_tuples< std::tuple< Tuple1...>, typename join_tuples< std::tuple< Tuple2...>, Tuples...>::type >::type type
create a tuple with types from both tuples, but guaranting that any type will appear only once ...
std::conditional< has_type< std::tuple< Tuple2...>, T >::value, std::tuple<>, std::tuple< T > >::type type
tuple_copy_helper(Tuple &tuple, SrcTuple const &src_tuple)
copy the matching elements (by type) from one tuple into anothe
return true if the Dimensions provided match exactly those of the structure T (including order) ...
void tuple_copy(std::tuple< TupleTs...> const &src_tuple, std::tuple< Ts...> &dst_tuple)
return true if the all Dimensions provided are represented in the structure
unique_tuple< typename std::conditional< has_type< std::tuple< Tuple1s...>, T >::value, std::tuple< Tuple1s...>, std::tuple< Tuple1s..., T > >::type, std::tuple< Tuple2s...> >::type type
return true if the Dimension is represented in the structure
std::tuple< Tuple1s...> type
static void exec(std::tuple< TupleTs...> &tuple, T1 const &value, T2 const &value2, Ts const &...values)
merge_tuples_type< Tuple1, Tuple2 >::type merge_tuples(Tuple1 const &tuple1, Tuple2 const &tuple2)