• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main()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   }
131