yoda is hosted by Hepforge, IPPP Durham
YODA - Yet more Objects for Data Analysis 2.0.3
MetaUtils.h
Go to the documentation of this file.
1#ifndef META_UTILS_H
2#define META_UTILS_H
3
4#include <iostream>
5#include <tuple>
6
7#define CHECK_TEST_RES(pred) MetaUtils::check(pred, __PRETTY_FUNCTION__)
8
10namespace MetaUtils {
11
12
13 template <class Func, std::size_t... Is>
14 constexpr void staticForImpl(Func &&f,
15 std::index_sequence<Is...>) {
16 // Use C++17 fold expressions to apply Func f
17 // to all Is... in sequence
18 //
19 // Won't work on empty tuple (Binning is not intended to work with 0 dimensions).
20 //
21 // std::integral_constant used to encode value into type, otherwise it's not
22 // possible to use Is inside functor as consant expression
23 // (std::get<Is> etc. won't work)
24
25 ((void)f(std::integral_constant<std::size_t, Is>()), ...);
26 }
27
34 template <size_t N, class Func>
35 constexpr void staticFor(Func&& f) {
36 staticForImpl(std::forward<Func>(f),
37 std::make_index_sequence<N>{});
38 }
39
40
43 template<class...> struct conjunction : std::true_type { };
44 template<class B1> struct conjunction<B1> : B1 { };
45 template<class B1, class... Bn>
46 struct conjunction<B1, Bn...>
47 : std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
48
49 struct nonesuch {
50 ~nonesuch() = delete;
51 nonesuch(nonesuch const&) = delete;
52 void operator=(nonesuch const&) = delete;
53 };
54
55 namespace operatorTraits {
56 template<class T>
57 using addition_assignment_t = decltype(std::declval<T&>() += std::declval<const T&>());
58 }
59
62 namespace detail {
63 template <class Default, class AlwaysVoid,
64 template<class...> class Op, class... Args>
65 struct detector {
66 using value_t = std::false_type;
67 using type = Default;
68 };
69
70 template <class Default, template<class...> class Op, class... Args>
71 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
72 using value_t = std::true_type;
73 using type = Op<Args...>;
74 };
75
76 } // namespace detail
77
79 namespace {
80 template <typename, template <typename...> class>
81 struct is_instance_impl : public std::false_type {};
82
83 template <template <typename...> class U, typename...Ts>
84 struct is_instance_impl<U<Ts...>, U> : public std::true_type {};
85 }
86
88 template <typename T, template <typename ...> class U>
89 using is_instance = is_instance_impl<std::decay_t<T>, U>;
90
91 template <template<class...> class Op, class... Args>
92 using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
93
94 template <template<class...> class Op, class... Args>
95 using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;
96
97 template <class Default, template<class...> class Op, class... Args>
98 using detected_or = detail::detector<Default, void, Op, Args...>;
99
100 template <class Expected, template<class...> class Op, class... Args>
101 using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
102
103 template< template<class...> class Op, class... Args >
104 constexpr bool is_detected_v = is_detected<Op, Args...>::value;
105
110 template <typename T, template <class U> class Concept>
111 constexpr bool checkConcept() {
112 return Concept<T>::checkResult::value;
113 }
114
115 inline int check(bool pred, const char* funcName) {
116 if (pred == false)
117 std::clog << funcName << " FAILED\n";
118 return (int)(pred ? EXIT_SUCCESS : EXIT_FAILURE);
119 }
120
121
122 namespace {
123
124 template <size_t, size_t>
125 struct _tuple {
126 template <typename T>
127 static auto remove (const T& t) {
128 return std::make_tuple(t);
129 }
130 };
131
132 template <size_t N>
133 struct _tuple<N, N> {
134 template <typename T>
135 static std::tuple<> remove (const T&) {
136 return {};
137 }
138 };
139
140 template<size_t N, typename T, size_t... Is>
141 auto _removeTupleElement(const T& tup, std::index_sequence<Is...>) {
142 return std::tuple_cat( _tuple<Is, N>::remove(std::get<Is>(tup))...);
143 }
144
145 }
146
147 template<size_t I, typename... Ts>
148 auto removeTupleElement(const std::tuple<Ts...>& tup) {
149 return _removeTupleElement<I>(tup, std::make_index_sequence<sizeof...(Ts)>{});
150 }
151
152
153}
154
155#endif
decltype(std::declval< T & >()+=std::declval< const T & >()) addition_assignment_t
Definition MetaUtils.h:57
constexpr void staticForImpl(Func &&f, std::index_sequence< Is... >)
Definition MetaUtils.h:14
constexpr void staticFor(Func &&f)
Used to apply functor on tuple. Calls lambda with integral constant, which can be used to query tuple...
Definition MetaUtils.h:35
auto removeTupleElement(const std::tuple< Ts... > &tup)
Definition MetaUtils.h:148
typename detail::detector< nonesuch, void, Op, Args... >::type detected_t
Definition MetaUtils.h:95
typename detail::detector< nonesuch, void, Op, Args... >::value_t is_detected
Definition MetaUtils.h:92
constexpr bool is_detected_v
Definition MetaUtils.h:104
is_instance_impl< std::decay_t< T >, U > is_instance
Detects if type T is an instance of template U.
Definition MetaUtils.h:89
int check(bool pred, const char *funcName)
Definition MetaUtils.h:115
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
Definition MetaUtils.h:101
constexpr bool checkConcept()
checks whether if T satisfies user defined Concept
Definition MetaUtils.h:111
Logical conjuction implementation.
Definition MetaUtils.h:43
std::false_type value_t
Definition MetaUtils.h:66
nonesuch(nonesuch const &)=delete
void operator=(nonesuch const &)=delete