1
/*=============================================================================
2
Copyright (c) 2001-2006 Joel de Guzman
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
10
#include <boost/fusion/support/detail/category_of.hpp>
11
#include <boost/fusion/support/tag_of.hpp>
12
#include <boost/type_traits/is_base_of.hpp>
14
namespace boost { namespace fusion
17
struct boost_tuple_tag; // boost::tuples::tuple tag
18
struct array_tag; // boost::array tag
19
struct mpl_sequence_tag; // mpl sequence tag
20
struct std_pair_tag; // std::pair tag
22
struct incrementable_traversal_tag {};
24
struct single_pass_traversal_tag
25
: incrementable_traversal_tag {};
27
struct forward_traversal_tag
28
: single_pass_traversal_tag {};
30
struct bidirectional_traversal_tag
31
: forward_traversal_tag {};
33
struct random_access_traversal_tag
34
: bidirectional_traversal_tag {};
36
struct associative_sequence_tag {};
40
template<typename Tag>
41
struct category_of_impl
44
struct apply : detail::fusion_category_of<T> {};
48
struct category_of_impl<boost_tuple_tag>;
51
struct category_of_impl<array_tag>;
54
struct category_of_impl<mpl_sequence_tag>;
57
struct category_of_impl<std_pair_tag>;
64
: extension::category_of_impl<typename fusion::detail::tag_of<T>::type>::
71
associative_sequence_tag
72
, typename category_of<T>::type>
76
struct is_incrementable
78
incrementable_traversal_tag
79
, typename category_of<T>::type>
85
single_pass_traversal_tag
86
, typename category_of<T>::type>
93
, typename category_of<T>::type>
97
struct is_bidirectional
99
bidirectional_traversal_tag
100
, typename category_of<T>::type>
103
template <typename T>
104
struct is_random_access
106
random_access_traversal_tag
107
, typename category_of<T>::type>