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>
280 META_CONCEPT same_as =
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>
302 META_CONCEPT invocable =
requires
304 typename quote<T::template invoke>;
307 template <
typename T>
308 META_CONCEPT list_like = is_v<T, list>;
311 template <
typename T>
312 META_CONCEPT integral =
requires
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
_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