epoc32/include/stdapis/boost/range/sub_range.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
// Boost.Range library
williamr@2
     2
//
williamr@2
     3
//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
williamr@2
     4
//  distribution is subject to the Boost Software License, Version
williamr@2
     5
//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
williamr@2
     6
//  http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     7
//
williamr@2
     8
// For more information, see http://www.boost.org/libs/range/
williamr@2
     9
//
williamr@2
    10
williamr@2
    11
#ifndef BOOST_RANGE_SUB_RANGE_HPP
williamr@2
    12
#define BOOST_RANGE_SUB_RANGE_HPP
williamr@2
    13
williamr@2
    14
#include <boost/range/config.hpp>
williamr@2
    15
#include <boost/range/iterator_range.hpp>
williamr@2
    16
#include <boost/range/value_type.hpp>
williamr@2
    17
#include <boost/range/result_iterator.hpp>
williamr@2
    18
#include <boost/range/size_type.hpp>
williamr@2
    19
#include <boost/range/difference_type.hpp>
williamr@2
    20
#include <boost/assert.hpp>
williamr@2
    21
williamr@2
    22
namespace boost
williamr@2
    23
{
williamr@2
    24
    
williamr@2
    25
    template< class ForwardRange > 
williamr@2
    26
    class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type > 
williamr@2
    27
    {
williamr@2
    28
        typedef BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type iterator_t;
williamr@2
    29
        typedef iterator_range< iterator_t  > base;
williamr@2
    30
williamr@2
    31
        typedef BOOST_DEDUCED_TYPENAME base::impl impl;
williamr@2
    32
    public:
williamr@2
    33
        typedef BOOST_DEDUCED_TYPENAME range_value<ForwardRange>::type            value_type;
williamr@2
    34
        typedef BOOST_DEDUCED_TYPENAME range_result_iterator<ForwardRange>::type  iterator;
williamr@2
    35
        typedef BOOST_DEDUCED_TYPENAME range_const_iterator<ForwardRange>::type   const_iterator;
williamr@2
    36
        typedef BOOST_DEDUCED_TYPENAME range_difference<ForwardRange>::type       difference_type;
williamr@2
    37
        typedef BOOST_DEDUCED_TYPENAME range_size<ForwardRange>::type             size_type;
williamr@2
    38
        typedef BOOST_DEDUCED_TYPENAME base::reference                            reference;
williamr@2
    39
        typedef BOOST_DEDUCED_TYPENAME iterator_reference<const_iterator>::type   const_reference;
williamr@2
    40
williamr@2
    41
    public:
williamr@2
    42
        sub_range() : base() 
williamr@2
    43
        { }
williamr@2
    44
williamr@2
    45
/*        
williamr@2
    46
        template< class ForwardRange2 >
williamr@2
    47
        sub_range( sub_range<ForwardRange2> r ) :
williamr@2
    48
williamr@2
    49
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
williamr@2
    50
            base( impl::adl_begin( r ), impl::adl_end( r ) )
williamr@2
    51
#else
williamr@2
    52
            base( r )
williamr@2
    53
#endif */
williamr@2
    54
williamr@2
    55
        template< class ForwardRange2 >
williamr@2
    56
        sub_range( ForwardRange2& r ) : 
williamr@2
    57
            
williamr@2
    58
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
williamr@2
    59
            base( impl::adl_begin( r ), impl::adl_end( r ) )
williamr@2
    60
#else
williamr@2
    61
            base( r )
williamr@2
    62
#endif        
williamr@2
    63
        { }
williamr@2
    64
        
williamr@2
    65
        template< class ForwardRange2 >
williamr@2
    66
        sub_range( const ForwardRange2& r ) : 
williamr@2
    67
williamr@2
    68
#if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 )
williamr@2
    69
            base( impl::adl_begin( r ), impl::adl_end( r ) )
williamr@2
    70
#else
williamr@2
    71
            base( r )
williamr@2
    72
#endif                
williamr@2
    73
        { }
williamr@2
    74
williamr@2
    75
        template< class Iter >
williamr@2
    76
        sub_range( Iter first, Iter last ) :
williamr@2
    77
            base( first, last )
williamr@2
    78
        { }
williamr@2
    79
        
williamr@2
    80
        template< class ForwardRange2 >
williamr@2
    81
        sub_range& operator=( ForwardRange2& r )
williamr@2
    82
        {
williamr@2
    83
            base::operator=( r );
williamr@2
    84
            return *this;
williamr@2
    85
        }
williamr@2
    86
williamr@2
    87
        template< class ForwardRange2 >
williamr@2
    88
        sub_range& operator=( const ForwardRange2& r )
williamr@2
    89
        {
williamr@2
    90
            base::operator=( r );
williamr@2
    91
            return *this;
williamr@2
    92
        }
williamr@2
    93
williamr@2
    94
        sub_range& operator=( sub_range r )
williamr@2
    95
        {
williamr@2
    96
            //
williamr@2
    97
            // argument passed by value to avoid 
williamr@2
    98
            // const_iterator to iterator conversion
williamr@2
    99
            //
williamr@2
   100
            base::operator=( r );
williamr@2
   101
            return *this;            
williamr@2
   102
        }
williamr@2
   103
        
williamr@2
   104
    public:
williamr@2
   105
        
williamr@2
   106
        iterator        begin()          { return base::begin(); }
williamr@2
   107
        const_iterator  begin() const    { return base::begin(); }
williamr@2
   108
        iterator        end()            { return base::end();   }
williamr@2
   109
        const_iterator  end() const      { return base::end();   }
williamr@2
   110
        size_type       size() const     { return base::size();  }   
williamr@2
   111
williamr@2
   112
        
williamr@2
   113
    public: // convenience
williamr@2
   114
        reference front()
williamr@2
   115
        {
williamr@2
   116
            return base::front();
williamr@2
   117
        }
williamr@2
   118
williamr@2
   119
        const_reference front() const
williamr@2
   120
        {
williamr@2
   121
            return base::front();
williamr@2
   122
        }
williamr@2
   123
williamr@2
   124
        reference back()
williamr@2
   125
        {
williamr@2
   126
            return base::back();
williamr@2
   127
        }
williamr@2
   128
williamr@2
   129
        const_reference back() const
williamr@2
   130
        {
williamr@2
   131
            return base::back();
williamr@2
   132
        }
williamr@2
   133
williamr@2
   134
        reference operator[]( size_type sz )
williamr@2
   135
        {
williamr@2
   136
            return base::operator[](sz);
williamr@2
   137
        }
williamr@2
   138
williamr@2
   139
        const_reference operator[]( size_type sz ) const
williamr@2
   140
        {
williamr@2
   141
            return base::operator[](sz);
williamr@2
   142
        }
williamr@2
   143
williamr@2
   144
    };
williamr@2
   145
williamr@2
   146
    template< class ForwardRange, class ForwardRange2 >
williamr@2
   147
    inline bool operator==( const sub_range<ForwardRange>& l,
williamr@2
   148
                            const sub_range<ForwardRange2>& r )
williamr@2
   149
    {
williamr@2
   150
        return iterator_range_detail::equal( l, r );
williamr@2
   151
    }
williamr@2
   152
williamr@2
   153
    template< class ForwardRange, class ForwardRange2 >
williamr@2
   154
    inline bool operator!=( const sub_range<ForwardRange>& l,
williamr@2
   155
                            const sub_range<ForwardRange2>& r )
williamr@2
   156
    {
williamr@2
   157
        return !iterator_range_detail::equal( l, r );
williamr@2
   158
    }
williamr@2
   159
williamr@2
   160
    template< class ForwardRange, class ForwardRange2 >
williamr@2
   161
    inline bool operator<( const sub_range<ForwardRange>& l,
williamr@2
   162
                           const sub_range<ForwardRange2>& r )
williamr@2
   163
    {
williamr@2
   164
        return iterator_range_detail::less_than( l, r );
williamr@2
   165
    }
williamr@2
   166
williamr@2
   167
williamr@2
   168
} // namespace 'boost'
williamr@2
   169
williamr@2
   170
#endif