os/ossrv/ossrv_pub/boost_apis/boost/range/detail/end.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Boost.Range library
sl@0
     2
//
sl@0
     3
//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
sl@0
     4
//  distribution is subject to the Boost Software License, Version
sl@0
     5
//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
sl@0
     6
//  http://www.boost.org/LICENSE_1_0.txt)
sl@0
     7
//
sl@0
     8
// For more information, see http://www.boost.org/libs/range/
sl@0
     9
//
sl@0
    10
sl@0
    11
#ifndef BOOST_RANGE_DETAIL_END_HPP
sl@0
    12
#define BOOST_RANGE_DETAIL_END_HPP
sl@0
    13
sl@0
    14
#include <boost/config.hpp> // BOOST_MSVC
sl@0
    15
#include <boost/detail/workaround.hpp>
sl@0
    16
sl@0
    17
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
sl@0
    18
# include <boost/range/detail/vc6/end.hpp>
sl@0
    19
#else
sl@0
    20
# include <boost/range/detail/implementation_help.hpp>
sl@0
    21
# include <boost/range/detail/implementation_help.hpp>
sl@0
    22
# include <boost/range/result_iterator.hpp>
sl@0
    23
# include <boost/range/detail/common.hpp>
sl@0
    24
# if BOOST_WORKAROUND(BOOST_MSVC, < 1310)
sl@0
    25
#  include <boost/range/detail/remove_extent.hpp>
sl@0
    26
# endif
sl@0
    27
sl@0
    28
namespace boost 
sl@0
    29
{
sl@0
    30
    namespace range_detail
sl@0
    31
    {
sl@0
    32
        template< typename T >
sl@0
    33
        struct range_end;
sl@0
    34
sl@0
    35
        //////////////////////////////////////////////////////////////////////
sl@0
    36
        // default
sl@0
    37
        //////////////////////////////////////////////////////////////////////
sl@0
    38
        
sl@0
    39
        template<>
sl@0
    40
        struct range_end<std_container_>
sl@0
    41
        {
sl@0
    42
            template< typename C >
sl@0
    43
            static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type 
sl@0
    44
            fun( C& c )
sl@0
    45
            {
sl@0
    46
                return c.end();
sl@0
    47
            };
sl@0
    48
        };
sl@0
    49
                    
sl@0
    50
        //////////////////////////////////////////////////////////////////////
sl@0
    51
        // pair
sl@0
    52
        //////////////////////////////////////////////////////////////////////
sl@0
    53
        
sl@0
    54
        template<>
sl@0
    55
        struct range_end<std_pair_>
sl@0
    56
        {
sl@0
    57
            template< typename P >
sl@0
    58
            static BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<P>::type 
sl@0
    59
            fun( const P& p )
sl@0
    60
            {
sl@0
    61
                return p.second;
sl@0
    62
            }
sl@0
    63
        };
sl@0
    64
 
sl@0
    65
        //////////////////////////////////////////////////////////////////////
sl@0
    66
        // array
sl@0
    67
        //////////////////////////////////////////////////////////////////////
sl@0
    68
        
sl@0
    69
        template<>
sl@0
    70
        struct range_end<array_>  
sl@0
    71
        {
sl@0
    72
        #if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
sl@0
    73
            template< typename T, std::size_t sz >
sl@0
    74
            static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
sl@0
    75
            {
sl@0
    76
                return boost::range_detail::array_end( boost_range_array );
sl@0
    77
            }
sl@0
    78
        #else
sl@0
    79
            template<typename T>
sl@0
    80
            static BOOST_RANGE_DEDUCED_TYPENAME remove_extent<T>::type* fun(T& t)
sl@0
    81
            {
sl@0
    82
                return t + remove_extent<T>::size;
sl@0
    83
            }
sl@0
    84
        #endif
sl@0
    85
        };
sl@0
    86
sl@0
    87
                
sl@0
    88
        template<>
sl@0
    89
        struct range_end<char_array_>
sl@0
    90
        {
sl@0
    91
            template< typename T, std::size_t sz >
sl@0
    92
            static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
sl@0
    93
            {
sl@0
    94
                return boost::range_detail::array_end( boost_range_array );
sl@0
    95
            }
sl@0
    96
        };
sl@0
    97
        
sl@0
    98
        template<>
sl@0
    99
        struct range_end<wchar_t_array_>
sl@0
   100
        {
sl@0
   101
            template< typename T, std::size_t sz >
sl@0
   102
            static T* fun( T BOOST_RANGE_ARRAY_REF()[sz] )
sl@0
   103
            {
sl@0
   104
                return boost::range_detail::array_end( boost_range_array );
sl@0
   105
            }
sl@0
   106
        };
sl@0
   107
sl@0
   108
        //////////////////////////////////////////////////////////////////////
sl@0
   109
        // string
sl@0
   110
        //////////////////////////////////////////////////////////////////////
sl@0
   111
        
sl@0
   112
        template<>
sl@0
   113
        struct range_end<char_ptr_>
sl@0
   114
        {
sl@0
   115
            static char* fun( char* s )
sl@0
   116
            {
sl@0
   117
                return boost::range_detail::str_end( s );
sl@0
   118
            }
sl@0
   119
        };
sl@0
   120
sl@0
   121
        template<>
sl@0
   122
        struct range_end<const_char_ptr_>
sl@0
   123
        {
sl@0
   124
            static const char* fun( const char* s )
sl@0
   125
            {
sl@0
   126
                return boost::range_detail::str_end( s );
sl@0
   127
            }
sl@0
   128
        };
sl@0
   129
sl@0
   130
        template<>
sl@0
   131
        struct range_end<wchar_t_ptr_>
sl@0
   132
        {
sl@0
   133
            static wchar_t* fun( wchar_t* s )
sl@0
   134
            {
sl@0
   135
                return boost::range_detail::str_end( s );
sl@0
   136
            }
sl@0
   137
        };
sl@0
   138
sl@0
   139
sl@0
   140
        template<>
sl@0
   141
        struct range_end<const_wchar_t_ptr_>
sl@0
   142
        {
sl@0
   143
            static const wchar_t* fun( const wchar_t* s )
sl@0
   144
            {
sl@0
   145
                return boost::range_detail::str_end( s );
sl@0
   146
            }
sl@0
   147
        };
sl@0
   148
        
sl@0
   149
    } // namespace 'range_detail'
sl@0
   150
    
sl@0
   151
    template< typename C >
sl@0
   152
    inline BOOST_RANGE_DEDUCED_TYPENAME range_result_iterator<C>::type 
sl@0
   153
    end( C& c )
sl@0
   154
    {
sl@0
   155
        return range_detail::range_end< BOOST_RANGE_DEDUCED_TYPENAME range_detail::range<C>::type >::fun( c );
sl@0
   156
    }
sl@0
   157
    
sl@0
   158
} // namespace 'boost'
sl@0
   159
sl@0
   160
# endif // VC6
sl@0
   161
#endif