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).
7 #if !defined(BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP)
8 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP
10 #include <boost/preprocessor/cat.hpp>
11 #include <boost/preprocessor/comparison/equal.hpp>
12 #include <boost/preprocessor/control/iif.hpp>
13 #include <boost/preprocessor/tuple/elem.hpp>
14 #include <boost/preprocessor/tuple/size.hpp>
15 #include <boost/vmd/identity.hpp>
16 #include <boost/vmd/is_tuple.hpp>
17 #include <boost/vmd/detail/idprefix.hpp>
18 #include <boost/vmd/detail/number_registration.hpp>
19 #include <boost/vmd/detail/type_registration.hpp>
21 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
24 BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX, \
29 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE(cres) \
30 BOOST_VMD_IDENTITY_RESULT \
36 BOOST_PP_TUPLE_SIZE(cres), \
39 BOOST_PP_TUPLE_ELEM, \
40 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
46 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D(d,cres) \
47 BOOST_VMD_IDENTITY_RESULT \
54 BOOST_PP_TUPLE_SIZE(cres), \
57 BOOST_PP_TUPLE_ELEM, \
58 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
64 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT(cres) \
65 BOOST_VMD_IDENTITY_RESULT \
69 BOOST_VMD_IS_TUPLE(cres), \
70 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE, \
71 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
77 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D(d,cres) \
78 BOOST_VMD_IDENTITY_RESULT \
82 BOOST_VMD_IS_TUPLE(cres), \
83 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D, \
84 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
92 Determines the type of an identifier.
94 The type may be that of an identifier or else
97 Assumes the 'id' is a valid identifier id
99 Expands to the appropriate type
103 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE(id) \
104 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT \
106 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
110 #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,id) \
111 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D \
114 BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
118 #endif /* BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP */