identifier_type.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // (C) Copyright Edward Diener 2011-2015
  2. // Use, modification and distribution are subject to the Boost Software License,
  3. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt).
  5. #if !defined(BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP)
  6. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP
  7. #include <boost/preprocessor/cat.hpp>
  8. #include <boost/preprocessor/comparison/equal.hpp>
  9. #include <boost/preprocessor/control/iif.hpp>
  10. #include <boost/preprocessor/tuple/elem.hpp>
  11. #include <boost/preprocessor/tuple/size.hpp>
  12. #include <boost/vmd/identity.hpp>
  13. #include <boost/vmd/is_tuple.hpp>
  14. #include <boost/vmd/detail/idprefix.hpp>
  15. #include <boost/vmd/detail/number_registration.hpp>
  16. #include <boost/vmd/detail/type_registration.hpp>
  17. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
  18. BOOST_PP_CAT \
  19. ( \
  20. BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX, \
  21. id \
  22. ) \
  23. /**/
  24. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE(cres) \
  25. BOOST_VMD_IDENTITY_RESULT \
  26. ( \
  27. BOOST_PP_IIF \
  28. ( \
  29. BOOST_PP_EQUAL \
  30. ( \
  31. BOOST_PP_TUPLE_SIZE(cres), \
  32. 2 \
  33. ), \
  34. BOOST_PP_TUPLE_ELEM, \
  35. BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
  36. ) \
  37. (0,cres) \
  38. ) \
  39. /**/
  40. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D(d,cres) \
  41. BOOST_VMD_IDENTITY_RESULT \
  42. ( \
  43. BOOST_PP_IIF \
  44. ( \
  45. BOOST_PP_EQUAL_D \
  46. ( \
  47. d, \
  48. BOOST_PP_TUPLE_SIZE(cres), \
  49. 2 \
  50. ), \
  51. BOOST_PP_TUPLE_ELEM, \
  52. BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
  53. ) \
  54. (0,cres) \
  55. ) \
  56. /**/
  57. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT(cres) \
  58. BOOST_VMD_IDENTITY_RESULT \
  59. ( \
  60. BOOST_PP_IIF \
  61. ( \
  62. BOOST_VMD_IS_TUPLE(cres), \
  63. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE, \
  64. BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
  65. ) \
  66. (cres) \
  67. ) \
  68. /**/
  69. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D(d,cres) \
  70. BOOST_VMD_IDENTITY_RESULT \
  71. ( \
  72. BOOST_PP_IIF \
  73. ( \
  74. BOOST_VMD_IS_TUPLE(cres), \
  75. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D, \
  76. BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
  77. ) \
  78. (d,cres) \
  79. ) \
  80. /**/
  81. /*
  82. Determines the type of an identifier.
  83. The type may be that of an identifier or else
  84. it may be a subtype.
  85. Assumes the 'id' is a valid identifier id
  86. Expands to the appropriate type
  87. */
  88. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE(id) \
  89. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT \
  90. ( \
  91. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
  92. ) \
  93. /**/
  94. #define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,id) \
  95. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D \
  96. ( \
  97. d, \
  98. BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
  99. ) \
  100. /**/
  101. #endif /* BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP */