]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/vmd/test/test_doc_whyhow.cxx
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / vmd / test / test_doc_whyhow.cxx
1
2 // (C) Copyright Edward Diener 2011-2015
3 // Use, modification and distribution are subject to the Boost Software License,
4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt).
6
7 #include <boost/vmd/elem.hpp>
8 #include <boost/vmd/equal.hpp>
9 #include <boost/vmd/get_type.hpp>
10 #include <boost/vmd/is_identifier.hpp>
11 #include <boost/vmd/is_seq.hpp>
12 #include <boost/vmd/is_tuple.hpp>
13 #include <boost/vmd/to_tuple.hpp>
14 #include <boost/preprocessor/control/iif.hpp>
15 #include <boost/detail/lightweight_test.hpp>
16
17 int main()
18 {
19
20 #if BOOST_PP_VARIADICS
21
22 #define BOOST_VMD_REGISTER_Seq (Seq)
23 #define BOOST_VMD_REGISTER_Tuple (Tuple)
24 #define BOOST_VMD_REGISTER_Unknown (Unknown)
25
26 #define BOOST_VMD_DETECT_Seq_Seq
27 #define BOOST_VMD_DETECT_Tuple_Tuple
28 #define BOOST_VMD_DETECT_Unknown_Unknown
29
30 #define AMACRO(param) \
31 BOOST_PP_IIF \
32 ( \
33 BOOST_VMD_IS_SEQ(param), \
34 Seq, \
35 BOOST_PP_IIF \
36 ( \
37 BOOST_VMD_IS_TUPLE(param), \
38 Tuple, \
39 Unknown \
40 ) \
41 )
42
43 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO((0)(1)),Seq));
44 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO((0,1)),Tuple));
45 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO(24),Unknown));
46
47 #define BOOST_VMD_REGISTER_NAME (NAME)
48 #define BOOST_VMD_REGISTER_ADDRESS (ADDRESS)
49
50 #define AMACRO1(param) \
51 BOOST_PP_IIF \
52 ( \
53 BOOST_VMD_IS_IDENTIFIER(param), \
54 AMACRO1_IDENTIFIER, \
55 AMACRO1_NO_IDENTIFIER \
56 ) \
57 (param)
58
59 #define AMACRO1_IDENTIFIER(param) AMACRO1_ ## param
60 #define AMACRO1_NO_IDENTIFIER(param) Parameter is not an identifier
61 #define AMACRO1_NAME Identifier is a NAME
62 #define AMACRO1_ADDRESS Identifier is an ADDRESS
63
64 #define BOOST_VMD_REGISTER_Parameter (Parameter)
65 #define BOOST_VMD_REGISTER_is (is)
66 #define BOOST_VMD_REGISTER_not (not)
67 #define BOOST_VMD_REGISTER_an (an)
68 #define BOOST_VMD_REGISTER_identifier (identifier)
69 #define BOOST_VMD_REGISTER_Identifier (Identifier)
70 #define BOOST_VMD_REGISTER_a (a)
71
72 #define BOOST_VMD_DETECT_NAME_NAME
73 #define BOOST_VMD_DETECT_ADDRESS_ADDRESS
74 #define BOOST_VMD_DETECT_Parameter_Parameter
75 #define BOOST_VMD_DETECT_is_is
76 #define BOOST_VMD_DETECT_not_not
77 #define BOOST_VMD_DETECT_an_an
78 #define BOOST_VMD_DETECT_identifier_identifier
79 #define BOOST_VMD_DETECT_Identifier_Identifier
80 #define BOOST_VMD_DETECT_a_a
81
82 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1((44)),Parameter is not an identifier));
83 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1(NAME),Identifier is a NAME));
84 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO1(ADDRESS),Identifier is an ADDRESS));
85
86 #define AMACRO2(param) \
87 BOOST_PP_IIF \
88 ( \
89 BOOST_VMD_IS_IDENTIFIER(param,NAME), \
90 AMACRO2_NAME, \
91 BOOST_PP_IIF \
92 ( \
93 BOOST_VMD_IS_IDENTIFIER(param,ADDRESS), \
94 AMACRO2_ADDRESS, \
95 AMACRO2_NO_IDENTIFIER \
96 ) \
97 ) \
98 (param)
99
100 #define BOOST_VMD_REGISTER_or (or)
101 #define BOOST_VMD_DETECT_or_or
102
103 #define AMACRO2_NO_IDENTIFIER(param) Parameter is not a NAME or ADDRESS identifier
104 #define AMACRO2_NAME(param) Identifier is a NAME
105 #define AMACRO2_ADDRESS(param) Identifier is an ADDRESS
106
107 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2((44)),Parameter is not a NAME or ADDRESS identifier));
108 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2(NAME),Identifier is a NAME));
109 BOOST_TEST(BOOST_VMD_EQUAL(AMACRO2(ADDRESS),Identifier is an ADDRESS));
110
111 #define ASEQUENCE (1,2) NAME 147 BOOST_VMD_TYPE_NUMBER (a)(b)
112
113 #define BOOST_VMD_REGISTER_b (b)
114 #define BOOST_VMD_DETECT_b_b
115
116 BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_TO_TUPLE(ASEQUENCE),((1,2),NAME,147,BOOST_VMD_TYPE_NUMBER,(a)(b))));
117 BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_ELEM(2,ASEQUENCE),147));
118
119 BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_GET_TYPE((1,2)),BOOST_VMD_TYPE_TUPLE));
120 BOOST_TEST(BOOST_VMD_EQUAL(BOOST_VMD_GET_TYPE(235),BOOST_VMD_TYPE_NUMBER));
121
122 #else
123
124 BOOST_ERROR("No variadic macro support");
125
126 #endif
127
128 return boost::report_errors();
129
130 }