Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:34:37

0001 // (C) Copyright Jeremy Siek 2002.
0002 // Distributed under the Boost Software License, Version 1.0. (See
0003 // accompanying file LICENSE_1_0.txt or copy at
0004 // http://www.boost.org/LICENSE_1_0.txt)
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 // Traversal Categories
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 // Convert an iterator category into a traversal tag
0030 //
0031 template< typename Cat >
0032 using iterator_category_to_traversal_t = mp11::mp_cond<
0033     // if already convertible to a traversal tag, we're done.
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 // Trait to get an iterator's traversal category
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 // Convert an iterator traversal to one of the traversal tags.
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 // Trait to retrieve one of the iterator traversal tags from the iterator category or traversal.
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 } // namespace iterators
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 } // namespace boost
0106 
0107 #endif // BOOST_ITERATOR_CATEGORIES_HPP