50 using type = std::integral_constant< size_t,
sizeof...(T) >;
63 constexpr
static size_t value = 0;
71 constexpr
static size_t value = 1;
89 using current_type =
typename std::tuple_element< 0, std::tuple< T... > >::type;
99 using current_type =
typename std::tuple_element< N, std::tuple< T... > >::type;
100 constexpr
static std::size_t
value =
117 template<
size_t N = 0,
typename XStream,
typename... T >
118 typename std::enable_if< (N >=
sizeof...(T)), XStream& >::type
ostream_tuple(XStream& s,
const std::tuple< T... >&)
134 template<
size_t N = 0,
typename XStream,
typename... T >
135 typename std::enable_if< (N <
sizeof...(T)), XStream& >::type
ostream_tuple(XStream& s,
const std::tuple< T... >&
t)
138 s << std::get< N >(
t);
140 return ostream_tuple< N + 1 >(s,
t);
154 template<
size_t N = 0,
typename XStream,
typename... T >
155 typename std::enable_if< (N >=
sizeof...(T)), XStream& >::type
istream_tuple(XStream& s, std::tuple< T... >&)
171 template<
size_t N = 0,
typename XStream,
typename... T >
172 typename std::enable_if< (N <
sizeof...(T)), XStream& >::type
istream_tuple(XStream& s, std::tuple< T... >&
t)
175 s >> std::get< N >(
t);
177 return istream_tuple< N + 1 >(s,
t);
193 template<
typename XTupleType,
typename XFunctorType >
static void visit(XTupleType& tup, XFunctorType& functor)
196 functor(NTypes - 1, std::get< NTypes - 1 >(tup));
213 template<
typename XTupleType,
typename XFunctorType >
static void visit(XTupleType& tup, XFunctorType& functor) {}
233 template<
typename XTupleType,
typename XFunctorType >
234 static void apply(XTupleType& tup,
size_t index, XFunctorType& functor)
237 if(index == NTypes - 1)
239 functor(std::get< NTypes - 1 >(tup));
265 template<
typename XTupleType,
typename XFunctorType >
266 static void apply(XTupleType& tup,
size_t index, XFunctorType& functor)
279 template<
typename XTupleType,
typename XFunctorType >
void apply_at(
const XTupleType& tup,
size_t index, XFunctorType& functor)
285 template<
typename XTupleType,
typename XFunctorType >
void apply_at(XTupleType& tup,
size_t index, XFunctorType& functor)
298 template<
typename XTupleType,
typename XTupleType2,
typename XFunctorType >
299 static void apply(XTupleType& tup1, XTupleType2& tup2,
size_t index, XFunctorType& functor)
302 if(index == NTypes - 1)
304 functor(std::get< NTypes - 1 >(tup1), std::get< NTypes - 1 >(tup2));
317 template<
typename XTupleType,
typename XTupleType2,
typename XFunctorType >
318 static void apply(XTupleType& tup1, XTupleType2& tup2,
size_t index, XFunctorType& functor)
323 template<
typename XTupleType,
typename XTupleType2,
typename XFunctorType >
324 void apply_at2(
const XTupleType& tup1, XTupleType& tup2,
size_t index, XFunctorType& functor)
330 template<
typename XTupleType,
typename XTupleType2,
typename XFunctorType >
331 void apply_at2(XTupleType& tup1, XTupleType2& tup2,
size_t index, XFunctorType& functor)
351 template<
typename Func,
typename Tuple,
size_t... Is >
353 -> decltype(std::forward< Func >(f)(std::get< Is >(std::forward< Tuple >(
t))...))
355 return std::forward< Func >(f)(std::get< Is >(std::forward< Tuple >(
t))...);
358 template<
typename Func,
typename Tuple >
360 std::forward< Func >(f), std::forward< Tuple >(
t),
364 std::forward< Func >(f), std::forward< Tuple >(
t),
365 typename mho_make_index_sequence< std::tuple_size<
typename std::decay< Tuple >::type >::
value >::type{});
371 template<
typename XValueType >
struct is_complex: std::false_type
374 template<>
struct is_complex< std::complex< float > >: std::true_type
377 template<>
struct is_complex< std::complex< double > >: std::true_type
380 template<>
struct is_complex< std::complex< long double > >: std::true_type
388 template<
typename XContainer1,
typename XContainer2 >
389 std::map< typename XContainer1::value_type, typename XContainer2::value_type >
zip_into_map(
const XContainer1& c1,
390 const XContainer2& c2)
392 auto it1 = c1.begin();
393 auto it2 = c2.begin();
394 std::map< typename XContainer1::value_type, typename XContainer2::value_type > zip;
395 while(it1 != c1.end() && it2 != c2.end())
Definition: MHO_Meta.hh:408
Definition: MHO_Meta.hh:417
Definition: MHO_Meta.hh:411
Definition: MHO_Meta.hh:414
t
Definition: picking_aedit.py:14
Definition: MHO_AdhocFlagging.hh:18
std::enable_if<(N >=sizeof...(T)), XStream & >::type istream_tuple(XStream &s, std::tuple< T... > &)
Returns an XStream& without modification for terminating case.
Definition: MHO_Meta.hh:155
void apply_at2(const XTupleType &tup1, XTupleType &tup2, size_t index, XFunctorType &functor)
Definition: MHO_Meta.hh:324
typename MHO_TypelistSizeImpl< L >::type MHO_TypelistSize
Class MHO_TypelistSize - alias to MHO_TypelistSize, retrieve the value itself with value (element of ...
Definition: MHO_Meta.hh:56
std::map< typename XContainer1::value_type, typename XContainer2::value_type > zip_into_map(const XContainer1 &c1, const XContainer2 &c2)
zip elements of two iterable (probably STL) containers (which define a value_type) into a map which t...
Definition: MHO_Meta.hh:389
std::enable_if<(N >=sizeof...(T)), XStream & >::type ostream_tuple(XStream &s, const std::tuple< T... > &)
Terminating case for ostream_tuple, does nothing and returns s.
Definition: MHO_Meta.hh:118
auto mho_tuple_apply_impl(Func &&f, Tuple &&t, mho_index_sequence< Is... >) -> decltype(std::forward< Func >(f)(std::get< Is >(std::forward< Tuple >(t))...))
Definition: MHO_Meta.hh:352
std::integral_constant< size_t, sizeof...(T) > type
Definition: MHO_Meta.hh:50
void apply_at(const XTupleType &tup, size_t index, XFunctorType &functor)
Applies a functor to an element at a specified index in a tuple.
Definition: MHO_Meta.hh:279
auto mho_tuple_apply(Func &&f, Tuple &&t) -> decltype(mho_tuple_apply_impl(std::forward< Func >(f), std::forward< Tuple >(t), typename mho_make_index_sequence< std::tuple_size< typename std::decay< Tuple >::type >::value >::type{}))
Definition: MHO_Meta.hh:359
Definition: MHO_Meta.hh:21
Class MHO_EmptyType.
Definition: MHO_Meta.hh:27
Class MHO_Typelist.
Definition: MHO_Meta.hh:34
Class MHO_TypelistSizeImpl.
Definition: MHO_Meta.hh:40
Definition: MHO_Meta.hh:341
Definition: MHO_Meta.hh:344
static void apply(XTupleType &tup1, XTupleType2 &tup2, size_t index, XFunctorType &functor)
Definition: MHO_Meta.hh:318
Definition: MHO_Meta.hh:297
static void apply(XTupleType &tup1, XTupleType2 &tup2, size_t index, XFunctorType &functor)
Definition: MHO_Meta.hh:299
static void apply(XTupleType &tup, size_t index, XFunctorType &functor)
Applies a functor to an element of a tuple at a given index.
Definition: MHO_Meta.hh:266
Class apply_to_tuple - generic apply functor to tuple element (for runtime-indexed access)
Definition: MHO_Meta.hh:222
static void apply(XTupleType &tup, size_t index, XFunctorType &functor)
Applies a functor to an element of a tuple at a specified index.
Definition: MHO_Meta.hh:234
typename std::tuple_element< 0, std::tuple< T... > >::type current_type
Definition: MHO_Meta.hh:89
Class count_instances_of_type - utility to count the instances of a particular type in a parameter pa...
Definition: MHO_Meta.hh:98
typename std::tuple_element< N, std::tuple< T... > >::type current_type
Definition: MHO_Meta.hh:99
constexpr static std::size_t value
Definition: MHO_Meta.hh:100
static void visit(XTupleType &tup, XFunctorType &functor)
Recursively applies functor to tuple elements and then itself.
Definition: MHO_Meta.hh:213
Class indexed_tuple_visit - generic apply functor (which takes and index value!) to all elements of a...
Definition: MHO_Meta.hh:186
static void visit(XTupleType &tup, XFunctorType &functor)
Applies a functor to all elements of an XTupleType tuple and recursively visits the next type.
Definition: MHO_Meta.hh:193
Definition: MHO_Meta.hh:372
Class is_same_count - utility to return 1 if two types are the same, zero otherwise.
Definition: MHO_Meta.hh:62