Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 09:04:17

0001 // Boost.Range library
0002 //
0003 //  Copyright Neil Groves 2010. Use, modification and
0004 //  distribution is subject to the Boost Software License, Version
0005 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
0006 //  http://www.boost.org/LICENSE_1_0.txt)
0007 //
0008 // For more information, see http://www.boost.org/libs/range/
0009 //
0010 #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
0011 #define BOOST_RANGE_DETAIL_ANY_ITERATOR_INTERFACE_HPP_INCLUDED
0012 
0013 #include <boost/mpl/if.hpp>
0014 #include <boost/range/detail/any_iterator_buffer.hpp>
0015 #include <boost/iterator/iterator_categories.hpp>
0016 #include <boost/type_traits/is_convertible.hpp>
0017 #include <boost/type_traits/is_reference.hpp>
0018 #include <boost/type_traits/remove_const.hpp>
0019 #include <boost/type_traits/remove_reference.hpp>
0020 
0021 namespace boost
0022 {
0023     namespace range_detail
0024     {
0025         template<class T>
0026         struct const_reference_type_generator
0027         {
0028             typedef typename mpl::if_<
0029                 typename is_reference<T>::type,
0030                 typename add_const<
0031                     typename remove_reference<T>::type
0032                 >::type&,
0033                 T
0034             >::type type;
0035         };
0036 
0037         template<class T>
0038         struct reference_as_value_type_generator
0039         {
0040             typedef typename remove_reference<
0041                 typename remove_const<T>::type
0042             >::type value_type;
0043 
0044             typedef typename mpl::if_<
0045                 typename is_convertible<const value_type&, value_type>::type,
0046                 value_type,
0047                 T
0048             >::type type;
0049         };
0050 
0051         template<
0052             class Reference
0053           , class Buffer
0054         >
0055         struct any_incrementable_iterator_interface
0056         {
0057             typedef Reference reference;
0058             typedef typename const_reference_type_generator<
0059                 Reference
0060             >::type const_reference;
0061             typedef typename reference_as_value_type_generator<
0062                 Reference
0063             >::type reference_as_value_type;
0064 
0065             typedef Buffer buffer_type;
0066 
0067             virtual ~any_incrementable_iterator_interface() {}
0068 
0069             virtual any_incrementable_iterator_interface*
0070                         clone(buffer_type& buffer) const = 0;
0071 
0072             virtual any_incrementable_iterator_interface<const_reference, Buffer>*
0073                         clone_const_ref(buffer_type& buffer) const = 0;
0074 
0075             virtual any_incrementable_iterator_interface<reference_as_value_type, Buffer>*
0076                         clone_reference_as_value(buffer_type& buffer) const = 0;
0077 
0078             virtual void increment() = 0;
0079         };
0080 
0081         template<
0082             class Reference
0083           , class Buffer
0084         >
0085         struct any_single_pass_iterator_interface
0086             : any_incrementable_iterator_interface<Reference, Buffer>
0087         {
0088             typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference reference;
0089             typedef typename any_incrementable_iterator_interface<Reference, Buffer>::const_reference const_reference;
0090             typedef typename any_incrementable_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0091             typedef typename any_incrementable_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0092 
0093             virtual any_single_pass_iterator_interface*
0094                         clone(buffer_type& buffer) const = 0;
0095 
0096             virtual any_single_pass_iterator_interface<const_reference, Buffer>*
0097                         clone_const_ref(buffer_type& buffer) const = 0;
0098 
0099             virtual any_single_pass_iterator_interface<reference_as_value_type, Buffer>*
0100                         clone_reference_as_value(buffer_type& buffer) const = 0;
0101 
0102             virtual reference dereference() const = 0;
0103 
0104             virtual bool equal(const any_single_pass_iterator_interface& other) const = 0;
0105         };
0106 
0107         template<
0108             class Reference
0109           , class Buffer
0110         >
0111         struct any_forward_iterator_interface
0112             : any_single_pass_iterator_interface<Reference, Buffer>
0113         {
0114             typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference reference;
0115             typedef typename any_single_pass_iterator_interface<Reference, Buffer>::const_reference const_reference;
0116             typedef typename any_single_pass_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0117             typedef typename any_single_pass_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0118 
0119             virtual any_forward_iterator_interface*
0120                         clone(buffer_type& buffer) const = 0;
0121 
0122             virtual any_forward_iterator_interface<const_reference, Buffer>*
0123                         clone_const_ref(buffer_type& buffer) const = 0;
0124 
0125             virtual any_forward_iterator_interface<reference_as_value_type, Buffer>*
0126                         clone_reference_as_value(buffer_type& buffer) const = 0;
0127         };
0128 
0129         template<
0130             class Reference
0131           , class Buffer
0132         >
0133         struct any_bidirectional_iterator_interface
0134             : any_forward_iterator_interface<Reference, Buffer>
0135         {
0136             typedef typename any_forward_iterator_interface<Reference, Buffer>::reference reference;
0137             typedef typename any_forward_iterator_interface<Reference, Buffer>::const_reference const_reference;
0138             typedef typename any_forward_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0139             typedef typename any_forward_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0140 
0141             virtual any_bidirectional_iterator_interface*
0142                         clone(buffer_type& buffer) const = 0;
0143 
0144             virtual any_bidirectional_iterator_interface<const_reference, Buffer>*
0145                         clone_const_ref(buffer_type& buffer) const = 0;
0146 
0147             virtual any_bidirectional_iterator_interface<reference_as_value_type, Buffer>*
0148                         clone_reference_as_value(buffer_type& buffer) const = 0;
0149 
0150             virtual void decrement() = 0;
0151         };
0152 
0153         template<
0154             class Reference
0155           , class Difference
0156           , class Buffer
0157         >
0158         struct any_random_access_iterator_interface
0159             : any_bidirectional_iterator_interface<
0160                     Reference
0161                   , Buffer
0162                 >
0163         {
0164             typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference reference;
0165             typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::const_reference const_reference;
0166             typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::buffer_type buffer_type;
0167             typedef typename any_bidirectional_iterator_interface<Reference, Buffer>::reference_as_value_type reference_as_value_type;
0168             typedef Difference difference_type;
0169 
0170             virtual any_random_access_iterator_interface*
0171                         clone(buffer_type& buffer) const = 0;
0172 
0173             virtual any_random_access_iterator_interface<const_reference, Difference, Buffer>*
0174                         clone_const_ref(buffer_type& buffer) const = 0;
0175 
0176             virtual any_random_access_iterator_interface<reference_as_value_type, Difference, Buffer>*
0177                         clone_reference_as_value(buffer_type& buffer) const = 0;
0178 
0179             virtual void advance(Difference offset) = 0;
0180 
0181             virtual Difference distance_to(const any_random_access_iterator_interface& other) const = 0;
0182         };
0183 
0184         template<
0185             class Traversal
0186           , class Reference
0187           , class Difference
0188           , class Buffer
0189         >
0190         struct any_iterator_interface_type_generator;
0191 
0192         template<
0193             class Reference
0194           , class Difference
0195           , class Buffer
0196         >
0197         struct any_iterator_interface_type_generator<
0198                     incrementable_traversal_tag
0199                   , Reference
0200                   , Difference
0201                   , Buffer
0202                 >
0203         {
0204             typedef any_incrementable_iterator_interface<Reference, Buffer> type;
0205         };
0206 
0207         template<
0208             class Reference
0209           , class Difference
0210           , class Buffer
0211         >
0212         struct any_iterator_interface_type_generator<
0213                     single_pass_traversal_tag
0214                   , Reference
0215                   , Difference
0216                   , Buffer
0217                 >
0218         {
0219             typedef any_single_pass_iterator_interface<Reference, Buffer> type;
0220         };
0221 
0222         template<
0223             class Reference
0224           , class Difference
0225           , class Buffer
0226         >
0227         struct any_iterator_interface_type_generator<
0228                     forward_traversal_tag
0229                   , Reference
0230                   , Difference
0231                   , Buffer
0232                 >
0233         {
0234             typedef any_forward_iterator_interface<Reference, Buffer> type;
0235         };
0236 
0237         template<
0238             class Reference
0239           , class Difference
0240           , class Buffer
0241         >
0242         struct any_iterator_interface_type_generator<
0243                     bidirectional_traversal_tag
0244                   , Reference
0245                   , Difference
0246                   , Buffer
0247                 >
0248         {
0249             typedef any_bidirectional_iterator_interface<Reference, Buffer> type;
0250         };
0251 
0252         template<
0253             class Reference
0254           , class Difference
0255           , class Buffer
0256         >
0257         struct any_iterator_interface_type_generator<
0258                     random_access_traversal_tag
0259                   , Reference
0260                   , Difference
0261                   , Buffer
0262                 >
0263         {
0264             typedef any_random_access_iterator_interface<
0265                         Reference
0266                       , Difference
0267                       , Buffer
0268                     > type;
0269         };
0270 
0271     } // namespace range_detail
0272 } // namespace boost
0273 
0274 #endif // include guard