DAW JSON Link
Loading...
Searching...
No Matches
daw_json_req_helper.h
Go to the documentation of this file.
1// Copyright (c) Darrell Wright
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// Official repository: https://github.com/beached/daw_json_link
7//
8
9#pragma once
10
11#include <daw/daw_cpp_feature_check.h>
12
15#if DAW_HAS_GCC_VER_LT( 13, 3 )
16#define DAW_JSON_DONT_USE_CONCEPTS
17#endif
18
19#if not defined( DAW_JSON_DONT_USE_CONCEPTS ) and defined( __cpp_lib_concepts )
20#if __cpp_lib_concepts >= 202002L
21#define DAW_JSON_USE_CONCEPTS
22#endif
23#endif
24
25// Allow customizable trait
26#define DAW_JSON_MAKE_REQ_TRAIT_CUSTOM( Name, /*ReqExpression*/... ) \
27 template<typename, typename = void> \
28 inline constexpr bool Name = false; \
29 \
30 template<typename T> \
31 inline constexpr bool Name<T, std::void_t<decltype( __VA_ARGS__ )>> = true
32
33#if defined( DAW_JSON_USE_CONCEPTS )
34#define DAW_JSON_MAKE_REQ_TRAIT( Name, /*ReqExpression*/... ) \
35 template<typename T> \
36 inline constexpr bool Name = requires { \
37 __VA_ARGS__; \
38 }
39
40#else
41#define DAW_JSON_MAKE_REQ_TRAIT( Name, /*ReqExpression*/... ) \
42 DAW_JSON_MAKE_REQ_TRAIT_CUSTOM( Name, __VA_ARGS__ )
43#endif
44
45#if defined( DAW_JSON_USE_CONCEPTS )
46#define DAW_JSON_MAKE_REQ_TRAIT2( Name, /*ReqExpression*/... ) \
47 template<typename T, typename U> \
48 concept Name = requires { \
49 __VA_ARGS__; \
50 }
51#else
52#define DAW_JSON_MAKE_REQ_TRAIT2( Name, /*ReqExpression*/... ) \
53 template<typename, typename, typename = void> \
54 inline constexpr bool Name = false; \
55 \
56 template<typename T, typename U> \
57 inline constexpr bool Name<T, U, std::void_t<decltype( __VA_ARGS__ )>> = \
58 true
59#endif
60
61#if defined( DAW_JSON_USE_CONCEPTS )
62#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( Name, /*MemberTypeAlias*/... ) \
63 template<typename T> \
64 concept Name = requires { \
65 typename __VA_ARGS__; \
66 }
67#else
68#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_NT( Name, /*MemberTypeAlias*/... ) \
69 template<typename, typename = void> \
70 inline constexpr bool Name = false; \
71 \
72 template<typename T> \
73 inline constexpr bool Name<T, std::void_t<__VA_ARGS__>> = true
74#endif
75
76#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_CUSTOM( Name, \
77 /*MemberTypeAlias*/... ) \
78 template<typename, typename = void> \
79 inline constexpr bool Name = false; \
80 \
81 template<typename T> \
82 inline constexpr bool Name<T, std::void_t<typename __VA_ARGS__>> = true
83
84#if defined( DAW_JSON_USE_CONCEPTS )
85#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT( Name, /*MemberTypeAlias*/... ) \
86 template<typename T> \
87 concept Name = requires { \
88 typename __VA_ARGS__; \
89 }
90#else
91#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT( Name, /*MemberTypeAlias*/... ) \
92 DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT_CUSTOM( Name, __VA_ARGS__ )
93#endif
94
95#if defined( DAW_JSON_USE_CONCEPTS )
96#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT2( Name, /*MemberTypeAlias*/... ) \
97 template<typename T, typename U> \
98 concept Name = requires { \
99 __VA_ARGS__; \
100 }
101#else
102#define DAW_JSON_MAKE_REQ_TYPE_ALIAS_TRAIT2( Name, /*MemberTypeAlias*/... ) \
103 template<typename, typename, typename = void> \
104 inline constexpr bool Name = false; \
105 \
106 template<typename T, typename U> \
107 inline constexpr bool Name<T, U, std::void_t<__VA_ARGS__>> = true
108#endif