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