epoc32/include/stdapis/boost/range/end.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_END_HPP
williamr@2
    12
#define BOOST_RANGE_END_HPP
williamr@2
    13
williamr@2
    14
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
williamr@2
    15
# pragma once
williamr@2
    16
#endif
williamr@2
    17
williamr@2
    18
#include <boost/type_traits/remove_const.hpp>
williamr@2
    19
#include <boost/range/config.hpp>
williamr@2
    20
williamr@2
    21
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
williamr@2
    22
#include <boost/range/detail/end.hpp>
williamr@2
    23
#else
williamr@2
    24
williamr@2
    25
#include <boost/range/detail/implementation_help.hpp>
williamr@2
    26
#include <boost/range/iterator.hpp>
williamr@2
    27
#include <boost/range/const_iterator.hpp>
williamr@2
    28
williamr@2
    29
namespace boost
williamr@2
    30
{
williamr@2
    31
williamr@2
    32
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
    33
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
    34
    /**/
williamr@2
    35
namespace range_detail
williamr@2
    36
{
williamr@2
    37
#endif
williamr@2
    38
williamr@2
    39
        //////////////////////////////////////////////////////////////////////
williamr@2
    40
        // primary template
williamr@2
    41
        //////////////////////////////////////////////////////////////////////
williamr@2
    42
williamr@2
    43
        template< typename C >
williamr@2
    44
        inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
williamr@2
    45
        boost_range_end( const C& c )
williamr@2
    46
        {
williamr@2
    47
            return c.end();
williamr@2
    48
        }
williamr@2
    49
williamr@2
    50
        template< typename C >
williamr@2
    51
                inline BOOST_DEDUCED_TYPENAME range_iterator<
williamr@2
    52
                                        typename remove_const<C>::type >::type
williamr@2
    53
        boost_range_end( C& c )
williamr@2
    54
        {
williamr@2
    55
            return c.end();
williamr@2
    56
        }
williamr@2
    57
williamr@2
    58
        //////////////////////////////////////////////////////////////////////
williamr@2
    59
        // pair
williamr@2
    60
        //////////////////////////////////////////////////////////////////////
williamr@2
    61
williamr@2
    62
        template< typename Iterator >
williamr@2
    63
        inline Iterator boost_range_end( const std::pair<Iterator,Iterator>& p )
williamr@2
    64
        {
williamr@2
    65
            return p.second;
williamr@2
    66
        }
williamr@2
    67
williamr@2
    68
        template< typename Iterator >
williamr@2
    69
        inline Iterator boost_range_end( std::pair<Iterator,Iterator>& p )
williamr@2
    70
        {
williamr@2
    71
            return p.second;
williamr@2
    72
        }
williamr@2
    73
williamr@2
    74
        //////////////////////////////////////////////////////////////////////
williamr@2
    75
        // array
williamr@2
    76
        //////////////////////////////////////////////////////////////////////
williamr@2
    77
williamr@2
    78
        template< typename T, std::size_t sz >
williamr@2
    79
        inline const T* boost_range_end( const T (&array)[sz] )
williamr@2
    80
        {
williamr@2
    81
            return range_detail::array_end<T,sz>( array );
williamr@2
    82
        }
williamr@2
    83
williamr@2
    84
        template< typename T, std::size_t sz >
williamr@2
    85
        inline T* boost_range_end( T (&array)[sz] )
williamr@2
    86
        {
williamr@2
    87
            return range_detail::array_end<T,sz>( array );
williamr@2
    88
        }
williamr@2
    89
williamr@2
    90
        //////////////////////////////////////////////////////////////////////
williamr@2
    91
        // string
williamr@2
    92
        //////////////////////////////////////////////////////////////////////
williamr@2
    93
williamr@2
    94
#if 1 || BOOST_WORKAROUND(__MWERKS__, <= 0x3204 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
williamr@2
    95
// CW up to 9.3 and borland have troubles with function ordering
williamr@2
    96
        inline char* boost_range_end( char* s )
williamr@2
    97
        {
williamr@2
    98
            return range_detail::str_end( s );
williamr@2
    99
        }
williamr@2
   100
williamr@2
   101
        inline wchar_t* boost_range_end( wchar_t* s )
williamr@2
   102
        {
williamr@2
   103
            return range_detail::str_end( s );
williamr@2
   104
        }
williamr@2
   105
williamr@2
   106
        inline const char* boost_range_end( const char* s )
williamr@2
   107
        {
williamr@2
   108
            return range_detail::str_end( s );
williamr@2
   109
        }
williamr@2
   110
williamr@2
   111
        inline const wchar_t* boost_range_end( const wchar_t* s )
williamr@2
   112
        {
williamr@2
   113
            return range_detail::str_end( s );
williamr@2
   114
        }
williamr@2
   115
#else
williamr@2
   116
        inline char* boost_range_end( char*& s )
williamr@2
   117
        {
williamr@2
   118
            return range_detail::str_end( s );
williamr@2
   119
        }
williamr@2
   120
williamr@2
   121
        inline wchar_t* boost_range_end( wchar_t*& s )
williamr@2
   122
        {
williamr@2
   123
            return range_detail::str_end( s );
williamr@2
   124
        }
williamr@2
   125
williamr@2
   126
        inline const char* boost_range_end( const char*& s )
williamr@2
   127
        {
williamr@2
   128
            return range_detail::str_end( s );
williamr@2
   129
        }
williamr@2
   130
williamr@2
   131
        inline const wchar_t* boost_range_end( const wchar_t*& s )
williamr@2
   132
        {
williamr@2
   133
            return range_detail::str_end( s );
williamr@2
   134
        }
williamr@2
   135
#endif
williamr@2
   136
williamr@2
   137
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
   138
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
   139
    /**/
williamr@2
   140
} // namespace 'range_detail'
williamr@2
   141
#endif
williamr@2
   142
williamr@2
   143
template< class T >
williamr@2
   144
inline BOOST_DEDUCED_TYPENAME range_iterator<
williamr@2
   145
                typename remove_const<T>::type >::type end( T& r )
williamr@2
   146
{
williamr@2
   147
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
   148
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
   149
    /**/
williamr@2
   150
    using namespace range_detail;
williamr@2
   151
#endif
williamr@2
   152
    return boost_range_end( r );
williamr@2
   153
}
williamr@2
   154
williamr@2
   155
template< class T >
williamr@2
   156
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type end( const T& r )
williamr@2
   157
{
williamr@2
   158
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
   159
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
   160
    /**/
williamr@2
   161
    using namespace range_detail;
williamr@2
   162
#endif
williamr@2
   163
    return boost_range_end( r );
williamr@2
   164
}
williamr@2
   165
williamr@2
   166
williamr@2
   167
williamr@2
   168
#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
williamr@2
   169
// BCB and CW are not able to overload pointer when class overloads are also available.
williamr@2
   170
template<>
williamr@2
   171
inline range_const_iterator<const char*>::type end<const char*>( const char*& r )
williamr@2
   172
{
williamr@2
   173
    return range_detail::str_end( r );
williamr@2
   174
}
williamr@2
   175
williamr@2
   176
template<>
williamr@2
   177
inline range_const_iterator<const wchar_t*>::type end<const wchar_t*>( const wchar_t*& r )
williamr@2
   178
{
williamr@2
   179
    return range_detail::str_end( r );
williamr@2
   180
}
williamr@2
   181
williamr@2
   182
#endif
williamr@2
   183
williamr@2
   184
} // namespace 'boost'
williamr@2
   185
williamr@2
   186
williamr@2
   187
williamr@2
   188
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
williamr@2
   189
williamr@2
   190
williamr@2
   191
namespace boost
williamr@2
   192
{
williamr@2
   193
    template< class T >
williamr@2
   194
    inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type
williamr@2
   195
    const_end( const T& r )
williamr@2
   196
    {
williamr@2
   197
        return boost::end( r );
williamr@2
   198
    }
williamr@2
   199
}
williamr@2
   200
williamr@2
   201
#endif