category_of.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #if !defined(FUSION_CATEGORY_OF_07202005_0308)
  7. #define FUSION_CATEGORY_OF_07202005_0308
  8. #include <boost/fusion/support/config.hpp>
  9. #include <boost/fusion/support/tag_of.hpp>
  10. #include <boost/type_traits/is_base_of.hpp>
  11. namespace boost { namespace fusion
  12. {
  13. // Special tags:
  14. struct boost_tuple_tag; // boost::tuples::tuple tag
  15. struct boost_array_tag; // boost::array tag
  16. struct mpl_sequence_tag; // mpl sequence tag
  17. struct std_pair_tag; // std::pair tag
  18. struct incrementable_traversal_tag {};
  19. struct single_pass_traversal_tag
  20. : incrementable_traversal_tag {};
  21. struct forward_traversal_tag
  22. : single_pass_traversal_tag {};
  23. struct bidirectional_traversal_tag
  24. : forward_traversal_tag {};
  25. struct random_access_traversal_tag
  26. : bidirectional_traversal_tag {};
  27. struct associative_tag {};
  28. struct unbounded_tag {};
  29. namespace extension
  30. {
  31. template<typename Tag>
  32. struct category_of_impl
  33. {
  34. template<typename T>
  35. struct apply
  36. {
  37. typedef typename T::category type;
  38. };
  39. };
  40. template <>
  41. struct category_of_impl<boost_tuple_tag>;
  42. template <>
  43. struct category_of_impl<boost_array_tag>;
  44. template <>
  45. struct category_of_impl<mpl_sequence_tag>;
  46. template <>
  47. struct category_of_impl<std_pair_tag>;
  48. }
  49. namespace traits
  50. {
  51. template <typename T>
  52. struct category_of
  53. : extension::category_of_impl<typename fusion::detail::tag_of<T>::type>::
  54. template apply<T>
  55. {};
  56. template <typename T>
  57. struct is_associative
  58. : is_base_of<
  59. associative_tag
  60. , typename category_of<T>::type>
  61. {};
  62. template <typename T>
  63. struct is_incrementable
  64. : is_base_of<
  65. incrementable_traversal_tag
  66. , typename category_of<T>::type>
  67. {};
  68. template <typename T>
  69. struct is_single_pass
  70. : is_base_of<
  71. single_pass_traversal_tag
  72. , typename category_of<T>::type>
  73. {};
  74. template <typename T>
  75. struct is_forward
  76. : is_base_of<
  77. forward_traversal_tag
  78. , typename category_of<T>::type>
  79. {};
  80. template <typename T>
  81. struct is_bidirectional
  82. : is_base_of<
  83. bidirectional_traversal_tag
  84. , typename category_of<T>::type>
  85. {};
  86. template <typename T>
  87. struct is_random_access
  88. : is_base_of<
  89. random_access_traversal_tag
  90. , typename category_of<T>::type>
  91. {};
  92. template <typename T>
  93. struct is_unbounded
  94. : is_base_of<
  95. unbounded_tag
  96. , typename category_of<T>::type>
  97. {};
  98. }
  99. }}
  100. #endif