]> git.lyx.org Git - lyx.git/blob - 3rdparty/boost/boost/fusion/support/category_of.hpp
Update to boost 1.72
[lyx.git] / 3rdparty / boost / boost / fusion / support / category_of.hpp
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