18 #include <type_traits>
22 #pragma GCC diagnostic push
23 #pragma GCC diagnostic ignored "-Wmissing-variable-declarations"
26 #define META_CXX_STD_14 201402L
27 #define META_CXX_STD_17 201703L
29 #if defined(_MSVC_LANG) && _MSVC_LANG > __cplusplus
30 #define META_CXX_VER _MSVC_LANG
32 #define META_CXX_VER __cplusplus
35 #if defined(__apple_build_version__) || defined(__clang__)
36 #if defined(__apple_build_version__) || (defined(__clang__) && __clang_major__ < 6)
37 #define META_WORKAROUND_LLVM_28385
40 #elif defined(_MSC_VER)
41 #define META_HAS_MAKE_INTEGER_SEQ 1
43 #define META_WORKAROUND_MSVC_702792
44 #define META_WORKAROUND_MSVC_703656
48 #define META_WORKAROUND_MSVC_756112
51 #elif defined(__GNUC__)
52 #define META_WORKAROUND_GCC_86356
54 #define META_WORKAROUND_GCC_UNKNOWN1
56 #if __GNUC__ == 5 && __GNUC_MINOR__ == 1
57 #define META_WORKAROUND_GCC_66405
60 #define META_WORKAROUND_CWG_1558
64 #ifndef META_CXX_VARIABLE_TEMPLATES
65 #ifdef __cpp_variable_templates
66 #define META_CXX_VARIABLE_TEMPLATES __cpp_variable_templates
68 #define META_CXX_VARIABLE_TEMPLATES (META_CXX_VER >= META_CXX_STD_14)
72 #ifndef META_CXX_INLINE_VARIABLES
73 #ifdef __cpp_inline_variables
74 #define META_CXX_INLINE_VARIABLES __cpp_inline_variables
76 #define META_CXX_INLINE_VARIABLES (META_CXX_VER >= META_CXX_STD_17)
80 #ifndef META_INLINE_VAR
81 #if META_CXX_INLINE_VARIABLES
82 #define META_INLINE_VAR inline
84 #define META_INLINE_VAR
88 #ifndef META_CXX_INTEGER_SEQUENCE
89 #ifdef __cpp_lib_integer_sequence
90 #define META_CXX_INTEGER_SEQUENCE __cpp_lib_integer_sequence
92 #define META_CXX_INTEGER_SEQUENCE (META_CXX_VER >= META_CXX_STD_14)
96 #ifndef META_HAS_MAKE_INTEGER_SEQ
98 #if __has_builtin(__make_integer_seq)
99 #define META_HAS_MAKE_INTEGER_SEQ 1
103 #ifndef META_HAS_MAKE_INTEGER_SEQ
104 #define META_HAS_MAKE_INTEGER_SEQ 0
107 #ifndef META_HAS_TYPE_PACK_ELEMENT
109 #if __has_builtin(__type_pack_element)
110 #define META_HAS_TYPE_PACK_ELEMENT 1
114 #ifndef META_HAS_TYPE_PACK_ELEMENT
115 #define META_HAS_TYPE_PACK_ELEMENT 0
118 #if !defined(META_DEPRECATED) && !defined(META_DISABLE_DEPRECATED_WARNINGS)
119 #if defined(__cpp_attribute_deprecated) || META_CXX_VER >= META_CXX_STD_14
120 #define META_DEPRECATED(...) [[deprecated(__VA_ARGS__)]]
121 #elif defined(__clang__) || defined(__GNUC__)
122 #define META_DEPRECATED(...) __attribute__((deprecated(__VA_ARGS__)))
125 #ifndef META_DEPRECATED
126 #define META_DEPRECATED(...)
129 #ifndef META_CXX_FOLD_EXPRESSIONS
130 #ifdef __cpp_fold_expressions
131 #define META_CXX_FOLD_EXPRESSIONS __cpp_fold_expressions
133 #define META_CXX_FOLD_EXPRESSIONS (META_CXX_VER >= META_CXX_STD_17)
137 #if META_CXX_FOLD_EXPRESSIONS
138 #if !META_CXX_VARIABLE_TEMPLATES
139 #error Fold expressions, but no variable templates?
143 #if (defined(__cpp_concepts) && __cpp_concepts > 0) || defined(META_DOXYGEN_INVOKED)
144 #if !META_CXX_VARIABLE_TEMPLATES
145 #error Concepts, but no variable templates?
147 #if __cpp_concepts <= 201507L && !defined(META_DOXYGEN_INVOKED)
148 #define META_CONCEPT concept bool
150 #define META_CONCEPT_BARRIER(...) ::meta::detail::barrier<__VA_ARGS__>
151 #define META_TYPE_CONSTRAINT(...) typename
153 #define META_CONCEPT concept
154 #define META_CONCEPT_BARRIER(...) __VA_ARGS__
155 #define META_TYPE_CONSTRAINT(...) __VA_ARGS__
158 #define META_TYPE_CONSTRAINT(...) typename
161 #if (defined(__cpp_lib_type_trait_variable_templates) && \
162 __cpp_lib_type_trait_variable_templates > 0)
163 #define META_CXX_TRAIT_VARIABLE_TEMPLATES 1
165 #define META_CXX_TRAIT_VARIABLE_TEMPLATES 0
168 #if defined(__clang__)
169 #define META_IS_SAME(...) __is_same(__VA_ARGS__)
170 #elif defined(__GNUC__) && __GNUC__ >= 6
171 #define META_IS_SAME(...) __is_same_as(__VA_ARGS__)
172 #elif META_CXX_TRAIT_VARIABLE_TEMPLATES
173 #define META_IS_SAME(...) std::is_same_v<__VA_ARGS__>
175 #define META_IS_SAME(...) std::is_same<__VA_ARGS__>::value
178 #if defined(__GNUC__) || defined(_MSC_VER)
179 #define META_IS_BASE_OF(...) __is_base_of(__VA_ARGS__)
180 #elif META_CXX_TRAIT_VARIABLE_TEMPLATES
181 #define META_IS_BASE_OF(...) std::is_base_of_v<__VA_ARGS__>
183 #define META_IS_BASE_OF(...) std::is_base_of<__VA_ARGS__>::value
186 #if defined(__clang__) || defined(_MSC_VER) || \
187 (defined(__GNUC__) && __GNUC__ >= 8)
188 #define META_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__)
189 #elif META_CXX_TRAIT_VARIABLE_TEMPLATES
190 #define META_IS_CONSTRUCTIBLE(...) std::is_constructible_v<__VA_ARGS__>
192 #define META_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value
197 #ifdef _LIBCPP_VERSION
198 #define META_BEGIN_NAMESPACE_STD _LIBCPP_BEGIN_NAMESPACE_STD
199 #define META_END_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD
200 #elif defined(_MSVC_STL_VERSION)
201 #define META_BEGIN_NAMESPACE_STD _STD_BEGIN
202 #define META_END_NAMESPACE_STD _STD_END
204 #define META_BEGIN_NAMESPACE_STD namespace std {
205 #define META_END_NAMESPACE_STD }
208 #if defined(__GLIBCXX__)
209 #define META_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_VERSION
210 #define META_END_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION
211 #define META_BEGIN_NAMESPACE_CONTAINER _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
212 #define META_END_NAMESPACE_CONTAINER _GLIBCXX_END_NAMESPACE_CONTAINER
214 #define META_BEGIN_NAMESPACE_VERSION
215 #define META_END_NAMESPACE_VERSION
216 #define META_BEGIN_NAMESPACE_CONTAINER
217 #define META_END_NAMESPACE_CONTAINER
220 #if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION >= 4000
221 #define META_TEMPLATE_VIS _LIBCPP_TEMPLATE_VIS
222 #elif defined(_LIBCPP_VERSION)
223 #define META_TEMPLATE_VIS _LIBCPP_TYPE_VIS_ONLY
225 #define META_TEMPLATE_VIS
231 #if META_CXX_INTEGER_SEQUENCE
232 using std::integer_sequence;
234 template <
typename T, T...>
235 struct integer_sequence;
238 template <
typename... Ts>
241 template <
typename T>
244 template <
template <
typename...>
class>
247 template <
typename T,
template <T...>
class F>
250 template <
template <
typename...>
class C,
typename... Ts>
253 template <
typename T,
template <T...>
class C, T... Is>
256 #if META_CXX_VARIABLE_TEMPLATES || defined(META_DOXYGEN_INVOKED)
261 template <
typename,
template <
typename...>
class>
262 META_INLINE_VAR constexpr
bool is_v =
false;
263 template <
typename... Ts,
template <
typename...>
class C>
264 META_INLINE_VAR constexpr
bool is_v<C<Ts...>, C> =
true;
271 META_INLINE_VAR constexpr
bool barrier = B;
273 template <
class T, T>
struct require_constant;
276 template <
typename...>
277 META_CONCEPT
is_true = META_CONCEPT_BARRIER(
true);
279 template <
typename T,
typename U>
281 META_CONCEPT_BARRIER(META_IS_SAME(T, U));
283 template <
template <
typename...>
class C,
typename... Ts>
284 META_CONCEPT valid = requires
289 template <
typename T,
template <T...>
class C, T... Is>
290 META_CONCEPT valid_i = requires
295 template <
typename T>
296 META_CONCEPT trait = requires
301 template <
typename T>
304 typename quote<T::template invoke>;
307 template <
typename T>
308 META_CONCEPT list_like = is_v<T, list>;
311 template <
typename T>
315 typename T::value_type;
316 typename T::type::value_type;
318 && same_as<typename T::value_type, typename T::type::value_type>
319 #if META_CXX_TRAIT_VARIABLE_TEMPLATES
320 && std::is_integral_v<typename T::value_type>
322 && std::is_integral<typename T::value_type>::value
329 requires
same_as<decltype(T::value),
const typename T::value_type>;
330 typename detail::require_constant<decltype(T::value), T::value>;
334 requires
same_as<decltype(T::type::value),
const typename T::value_type>;
335 typename detail::require_constant<decltype(T::type::value), T::type::value>;
336 requires T::value == T::type::value;
340 requires
same_as<decltype(T{}()),
typename T::value_type>;
341 typename detail::require_constant<decltype(T{}()), T{}()>;
342 requires T{}() == T::value;
351 template <META_TYPE_CONSTRAINT(invocable) F,
typename L>
357 #pragma GCC diagnostic pop
CPP_concept same_as
\concept same_as
Definition: concepts.hpp:853
CPP_concept is_true
\concept is_true
Definition: concepts.hpp:833
CPP_concept integral
\concept integral
Definition: concepts.hpp:947
CPP_concept invocable
\concept invocable
Definition: concepts.hpp:48
_t< extension::apply< Fn, L > > apply
Applies the invocable Fn using the types in the type list L as arguments.
Definition: meta.hpp:1030
defer< id, T > id
Definition: meta.hpp:585