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 #if !defined(BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP) 8 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP 9 10 #include <boost/preprocessor/comparison/equal.hpp> 11 #include <boost/preprocessor/control/iif.hpp> 12 #include <boost/preprocessor/logical/bitor.hpp> 13 #include <boost/preprocessor/punctuation/is_begin_parens.hpp> 14 #include <boost/preprocessor/tuple/elem.hpp> 15 #include <boost/preprocessor/variadic/size.hpp> 16 #include <boost/preprocessor/variadic/elem.hpp> 17 #include <boost/vmd/identity.hpp> 18 #include <boost/vmd/is_empty.hpp> 19 #include <boost/vmd/is_tuple.hpp> 20 #include <boost/vmd/detail/identifier.hpp> 21 #include <boost/vmd/detail/identifier_concat.hpp> 22 #include <boost/vmd/detail/not_empty.hpp> 23 24 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH(tup) \ 25 BOOST_VMD_DETAIL_NOT_EMPTY \ 26 ( \ 27 BOOST_PP_TUPLE_ELEM(0,tup) \ 28 ) \ 29 /**/ 30 31 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE(ptup) \ 32 BOOST_VMD_IDENTITY_RESULT \ 33 ( \ 34 BOOST_PP_IIF \ 35 ( \ 36 BOOST_VMD_IS_TUPLE(ptup), \ 37 BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH, \ 38 BOOST_VMD_IDENTITY(0) \ 39 ) \ 40 (ptup) \ 41 ) \ 42 /**/ 43 44 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID(vseq) \ 45 BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE \ 46 ( \ 47 BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \ 48 ) \ 49 /**/ 50 51 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(vseq) \ 52 BOOST_VMD_IDENTITY_RESULT \ 53 ( \ 54 BOOST_PP_IIF \ 55 ( \ 56 BOOST_PP_BITOR \ 57 ( \ 58 BOOST_VMD_IS_EMPTY(vseq), \ 59 BOOST_PP_IS_BEGIN_PARENS(vseq) \ 60 ), \ 61 BOOST_VMD_IDENTITY(0), \ 62 BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID \ 63 ) \ 64 (vseq) \ 65 ) \ 66 /**/ 67 68 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(...) \ 69 BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 70 /**/ 71 72 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D(d,...) \ 73 BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 74 /**/ 75 76 #define BOOST_VMD_DETAIL_IS_IDENTIFIER(...) \ 77 BOOST_PP_IIF \ 78 ( \ 79 BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \ 80 BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE, \ 81 BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE \ 82 ) \ 83 (__VA_ARGS__) \ 84 /**/ 85 86 #define BOOST_VMD_DETAIL_IS_IDENTIFIER_D(d,...) \ 87 BOOST_PP_IIF \ 88 ( \ 89 BOOST_PP_EQUAL_D(d,BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \ 90 BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D, \ 91 BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE_D \ 92 ) \ 93 (d,__VA_ARGS__) \ 94 /**/ 95 96 #endif /* BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP */ 97