/Src/Dependencies/Boost/boost/fusion/support/category_of.hpp

http://hadesmem.googlecode.com/ · C++ Header · 112 lines · 84 code · 21 blank · 7 comment · 0 complexity · 82854f43cd57993b019c869b425660e7 MD5 · raw file

  1. /*=============================================================================
  2. Copyright (c) 2001-2006 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/detail/category_of.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. namespace extension
  29. {
  30. template<typename Tag>
  31. struct category_of_impl
  32. {
  33. template<typename T>
  34. struct apply : detail::fusion_category_of<T> {};
  35. };
  36. template <>
  37. struct category_of_impl<boost_tuple_tag>;
  38. template <>
  39. struct category_of_impl<boost_array_tag>;
  40. template <>
  41. struct category_of_impl<mpl_sequence_tag>;
  42. template <>
  43. struct category_of_impl<std_pair_tag>;
  44. }
  45. namespace traits
  46. {
  47. template <typename T>
  48. struct category_of
  49. : extension::category_of_impl<typename fusion::detail::tag_of<T>::type>::
  50. template apply<T>
  51. {};
  52. template <typename T>
  53. struct is_associative
  54. : is_base_of<
  55. associative_tag
  56. , typename category_of<T>::type>
  57. {};
  58. template <typename T>
  59. struct is_incrementable
  60. : is_base_of<
  61. incrementable_traversal_tag
  62. , typename category_of<T>::type>
  63. {};
  64. template <typename T>
  65. struct is_single_pass
  66. : is_base_of<
  67. single_pass_traversal_tag
  68. , typename category_of<T>::type>
  69. {};
  70. template <typename T>
  71. struct is_forward
  72. : is_base_of<
  73. forward_traversal_tag
  74. , typename category_of<T>::type>
  75. {};
  76. template <typename T>
  77. struct is_bidirectional
  78. : is_base_of<
  79. bidirectional_traversal_tag
  80. , typename category_of<T>::type>
  81. {};
  82. template <typename T>
  83. struct is_random_access
  84. : is_base_of<
  85. random_access_traversal_tag
  86. , typename category_of<T>::type>
  87. {};
  88. }
  89. }}
  90. #endif