1#ifndef BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
2#define BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
3
4// Copyright 2021 Peter Dimov
5// Distributed under the Boost Software License, Version 1.0.
6// https://www.boost.org/LICENSE_1_0.txt
7
8#define BOOST_DESCRIBE_PP_EXPAND(x) x
9
10#define BOOST_DESCRIBE_PP_CAT(x, y) BOOST_DESCRIBE_PP_CAT_I(x, y)
11#define BOOST_DESCRIBE_PP_CAT_I(x, ...) x ## __VA_ARGS__
12
13#if defined(_MSC_VER) && !defined(__clang__)
14
15#define BOOST_DESCRIBE_PP_FIRST(x) BOOST_DESCRIBE_PP_FIRST_I((x))
16#define BOOST_DESCRIBE_PP_FIRST_I(x) BOOST_DESCRIBE_PP_FIRST_II x
17#define BOOST_DESCRIBE_PP_FIRST_II(x, ...) x
18
19#else
20
21#define BOOST_DESCRIBE_PP_FIRST(x) BOOST_DESCRIBE_PP_FIRST_I(x)
22#define BOOST_DESCRIBE_PP_FIRST_I(x, ...) x
23
24#endif
25
26#define BOOST_DESCRIBE_PP_IS_PAREN_I(x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_IS_PAREN_I_, BOOST_DESCRIBE_PP_IS_PAREN_II x)
27#define BOOST_DESCRIBE_PP_IS_PAREN_II(...) 0
28#define BOOST_DESCRIBE_PP_IS_PAREN_I_0 1,
29#define BOOST_DESCRIBE_PP_IS_PAREN_I_BOOST_DESCRIBE_PP_IS_PAREN_II 0,
30
31#define BOOST_DESCRIBE_PP_IS_PAREN(x) BOOST_DESCRIBE_PP_FIRST(BOOST_DESCRIBE_PP_IS_PAREN_I(x))
32
33#define BOOST_DESCRIBE_PP_EMPTY
34
35#define BOOST_DESCRIBE_PP_IS_EMPTY(x) BOOST_DESCRIBE_PP_IS_EMPTY_I(BOOST_DESCRIBE_PP_IS_PAREN(x), BOOST_DESCRIBE_PP_IS_PAREN(x BOOST_DESCRIBE_PP_EMPTY ()))
36#define BOOST_DESCRIBE_PP_IS_EMPTY_I(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_II(x, y)
37#define BOOST_DESCRIBE_PP_IS_EMPTY_II(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_III(x, y)
38#define BOOST_DESCRIBE_PP_IS_EMPTY_III(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_III_ ## x ## y
39#define BOOST_DESCRIBE_PP_IS_EMPTY_III_00 0
40#define BOOST_DESCRIBE_PP_IS_EMPTY_III_01 1
41#define BOOST_DESCRIBE_PP_IS_EMPTY_III_10 0
42#define BOOST_DESCRIBE_PP_IS_EMPTY_III_11 0
43
44#define BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_CALL_I_, BOOST_DESCRIBE_PP_IS_EMPTY(x))(F, a, x)
45#define BOOST_DESCRIBE_PP_CALL_I_0(F, a, x) F(a, x)
46#define BOOST_DESCRIBE_PP_CALL_I_1(F, a, x)
47
48#define BOOST_DESCRIBE_PP_PARSE(x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_PARSE_I_, BOOST_DESCRIBE_PP_PARSE_II x)
49#define BOOST_DESCRIBE_PP_PARSE_II(...) 0, (__VA_ARGS__),
50#define BOOST_DESCRIBE_PP_PARSE_I_BOOST_DESCRIBE_PP_PARSE_II 0, ~,
51#define BOOST_DESCRIBE_PP_PARSE_I_0 1
52
53#if defined(_MSC_VER) && !defined(__clang__)
54
55#define BOOST_DESCRIBE_PP_NAME(x) BOOST_DESCRIBE_PP_NAME_I(BOOST_DESCRIBE_PP_PARSE(x))
56#define BOOST_DESCRIBE_PP_NAME_I(x) BOOST_DESCRIBE_PP_NAME_II((x))
57#define BOOST_DESCRIBE_PP_NAME_II(x) BOOST_DESCRIBE_PP_NAME_III x
58#define BOOST_DESCRIBE_PP_NAME_III(x, y, z) #z
59
60#else
61
62#define BOOST_DESCRIBE_PP_NAME(x) BOOST_DESCRIBE_PP_NAME_I(BOOST_DESCRIBE_PP_PARSE(x))
63#define BOOST_DESCRIBE_PP_NAME_I(x) BOOST_DESCRIBE_PP_NAME_II(x)
64#define BOOST_DESCRIBE_PP_NAME_II(x, y, z) #z
65
66#endif
67
68// template<class C, class F> constexpr auto mfn( F C::* p ) { return p; }
69// template<class C, class F> constexpr auto mfn( F * p ) { return p; }
70
71#define BOOST_DESCRIBE_PP_POINTER(C, x) BOOST_DESCRIBE_PP_POINTER_I(C, BOOST_DESCRIBE_PP_PARSE(x))
72
73#define BOOST_DESCRIBE_PP_EXPAND_V(...) __VA_ARGS__
74
75#if defined(_MSC_VER) && !defined(__clang__)
76
77#define BOOST_DESCRIBE_PP_POINTER_I(C, x) BOOST_DESCRIBE_PP_POINTER_II((C, x))
78#define BOOST_DESCRIBE_PP_POINTER_II(x) BOOST_DESCRIBE_PP_POINTER_III x
79#define BOOST_DESCRIBE_PP_POINTER_III(C, x, y, z) BOOST_DESCRIBE_PP_POINTER_III_##x(C, y, z)
80#define BOOST_DESCRIBE_PP_POINTER_III_0(C, y, z) &C::z
81#define BOOST_DESCRIBE_PP_POINTER_III_1(C, y, z) ::boost::describe::detail::mfn<C, BOOST_DESCRIBE_PP_EXPAND_V y>(&C::z)
82
83#else
84
85#define BOOST_DESCRIBE_PP_POINTER_I(C, x) BOOST_DESCRIBE_PP_POINTER_II(C, x)
86#define BOOST_DESCRIBE_PP_POINTER_II(C, x, y, z) BOOST_DESCRIBE_PP_POINTER_III_##x(C, y, z)
87#define BOOST_DESCRIBE_PP_POINTER_III_0(C, y, z) &C::z
88#define BOOST_DESCRIBE_PP_POINTER_III_1(C, y, z) ::boost::describe::detail::mfn<C, BOOST_DESCRIBE_PP_EXPAND_V y>(&C::z)
89
90#endif
91
92#endif // #ifndef BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
93

source code of boost/libs/describe/include/boost/describe/detail/pp_utilities.hpp