File indexing completed on 2025-09-17 08:34:37
0001
0002
0003
0004
0005
0006 #ifndef BOOST_ITERATOR_CATEGORIES_HPP
0007 #define BOOST_ITERATOR_CATEGORIES_HPP
0008
0009 #include <iterator>
0010 #include <type_traits>
0011
0012 #include <boost/mpl/arg_fwd.hpp>
0013 #include <boost/mp11/utility.hpp>
0014
0015 namespace boost {
0016 namespace iterators {
0017
0018
0019
0020
0021 struct no_traversal_tag {};
0022 struct incrementable_traversal_tag : public no_traversal_tag {};
0023 struct single_pass_traversal_tag : public incrementable_traversal_tag {};
0024 struct forward_traversal_tag : public single_pass_traversal_tag {};
0025 struct bidirectional_traversal_tag : public forward_traversal_tag {};
0026 struct random_access_traversal_tag : public bidirectional_traversal_tag {};
0027
0028
0029
0030
0031 template< typename Cat >
0032 using iterator_category_to_traversal_t = mp11::mp_cond<
0033
0034 std::is_convertible< Cat, incrementable_traversal_tag >, Cat,
0035 std::is_convertible< Cat, std::random_access_iterator_tag >, random_access_traversal_tag,
0036 std::is_convertible< Cat, std::bidirectional_iterator_tag >, bidirectional_traversal_tag,
0037 std::is_convertible< Cat, std::forward_iterator_tag >, forward_traversal_tag,
0038 std::is_convertible< Cat, std::input_iterator_tag >, single_pass_traversal_tag,
0039 std::is_convertible< Cat, std::output_iterator_tag >, incrementable_traversal_tag,
0040 std::true_type, void
0041 >;
0042
0043 template< typename Cat >
0044 struct iterator_category_to_traversal
0045 {
0046 using type = iterator_category_to_traversal_t< Cat >;
0047 };
0048
0049
0050 template< typename Iterator >
0051 using iterator_traversal_t = iterator_category_to_traversal_t<
0052 typename std::iterator_traits< Iterator >::iterator_category
0053 >;
0054
0055 template< typename Iterator = mpl::arg< 1 > >
0056 struct iterator_traversal
0057 {
0058 using type = iterator_traversal_t< Iterator >;
0059 };
0060
0061
0062
0063
0064 template< typename Traversal >
0065 using pure_traversal_tag_t = mp11::mp_cond<
0066 std::is_convertible< Traversal, random_access_traversal_tag >, random_access_traversal_tag,
0067 std::is_convertible< Traversal, bidirectional_traversal_tag >, bidirectional_traversal_tag,
0068 std::is_convertible< Traversal, forward_traversal_tag >, forward_traversal_tag,
0069 std::is_convertible< Traversal, single_pass_traversal_tag >, single_pass_traversal_tag,
0070 std::is_convertible< Traversal, incrementable_traversal_tag >, incrementable_traversal_tag,
0071 std::true_type, void
0072 >;
0073
0074 template< typename Traversal >
0075 struct pure_traversal_tag
0076 {
0077 using type = pure_traversal_tag_t< Traversal >;
0078 };
0079
0080
0081
0082
0083 template< typename Iterator >
0084 using pure_iterator_traversal_t = pure_traversal_tag_t<
0085 iterator_traversal_t< Iterator >
0086 >;
0087
0088 template< typename Iterator = mpl::arg< 1 > >
0089 struct pure_iterator_traversal
0090 {
0091 using type = pure_iterator_traversal_t< Iterator >;
0092 };
0093
0094 }
0095
0096 using iterators::no_traversal_tag;
0097 using iterators::incrementable_traversal_tag;
0098 using iterators::single_pass_traversal_tag;
0099 using iterators::forward_traversal_tag;
0100 using iterators::bidirectional_traversal_tag;
0101 using iterators::random_access_traversal_tag;
0102 using iterators::iterator_category_to_traversal;
0103 using iterators::iterator_traversal;
0104
0105 }
0106
0107 #endif