epoc32/include/stdapis/boost/range/begin.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_BEGIN_HPP
williamr@2
    12
#define BOOST_RANGE_BEGIN_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/begin.hpp>
williamr@2
    23
#else
williamr@2
    24
williamr@2
    25
#include <boost/range/iterator.hpp>
williamr@2
    26
#include <boost/range/const_iterator.hpp>
williamr@2
    27
williamr@2
    28
namespace boost
williamr@2
    29
{
williamr@2
    30
williamr@2
    31
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
    32
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
    33
    /**/
williamr@2
    34
namespace range_detail
williamr@2
    35
{
williamr@2
    36
#endif
williamr@2
    37
williamr@2
    38
    //////////////////////////////////////////////////////////////////////
williamr@2
    39
    // primary template
williamr@2
    40
    //////////////////////////////////////////////////////////////////////
williamr@2
    41
williamr@2
    42
    template< typename C >
williamr@2
    43
    inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
williamr@2
    44
    boost_range_begin( const C& c )
williamr@2
    45
    {
williamr@2
    46
        return c.begin();
williamr@2
    47
    }
williamr@2
    48
williamr@2
    49
    template< typename C >
williamr@2
    50
    inline BOOST_DEDUCED_TYPENAME range_iterator<
williamr@2
    51
                                                                        typename remove_const<C>::type >::type
williamr@2
    52
    boost_range_begin( C& c )
williamr@2
    53
    {
williamr@2
    54
        return c.begin();
williamr@2
    55
    }
williamr@2
    56
williamr@2
    57
    //////////////////////////////////////////////////////////////////////
williamr@2
    58
    // pair
williamr@2
    59
    //////////////////////////////////////////////////////////////////////
williamr@2
    60
williamr@2
    61
    template< typename Iterator >
williamr@2
    62
    inline Iterator boost_range_begin( const std::pair<Iterator,Iterator>& p )
williamr@2
    63
    {
williamr@2
    64
        return p.first;
williamr@2
    65
    }
williamr@2
    66
williamr@2
    67
    template< typename Iterator >
williamr@2
    68
    inline Iterator boost_range_begin( std::pair<Iterator,Iterator>& p )
williamr@2
    69
    {
williamr@2
    70
        return p.first;
williamr@2
    71
    }
williamr@2
    72
williamr@2
    73
    //////////////////////////////////////////////////////////////////////
williamr@2
    74
    // array
williamr@2
    75
    //////////////////////////////////////////////////////////////////////
williamr@2
    76
williamr@2
    77
    template< typename T, std::size_t sz >
williamr@2
    78
    inline const T* boost_range_begin( const T (&array)[sz] )
williamr@2
    79
    {
williamr@2
    80
        return array;
williamr@2
    81
    }
williamr@2
    82
williamr@2
    83
    template< typename T, std::size_t sz >
williamr@2
    84
    inline T* boost_range_begin( T (&array)[sz] )
williamr@2
    85
    {
williamr@2
    86
        return array;
williamr@2
    87
    }
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 const char* boost_range_begin( const char* s )
williamr@2
    97
    {
williamr@2
    98
        return s;
williamr@2
    99
    }
williamr@2
   100
williamr@2
   101
    inline char* boost_range_begin( char* s )
williamr@2
   102
    {
williamr@2
   103
        return s;
williamr@2
   104
    }
williamr@2
   105
williamr@2
   106
    inline const wchar_t* boost_range_begin( const wchar_t* s )
williamr@2
   107
    {
williamr@2
   108
        return s;
williamr@2
   109
    }
williamr@2
   110
williamr@2
   111
    inline wchar_t* boost_range_begin( wchar_t* s )
williamr@2
   112
    {
williamr@2
   113
        return s;
williamr@2
   114
    }
williamr@2
   115
#else
williamr@2
   116
    inline const char* boost_range_begin( const char*& s )
williamr@2
   117
    {
williamr@2
   118
        return s;
williamr@2
   119
    }
williamr@2
   120
williamr@2
   121
    inline char* boost_range_begin( char*& s )
williamr@2
   122
    {
williamr@2
   123
        return s;
williamr@2
   124
    }
williamr@2
   125
williamr@2
   126
    inline const wchar_t* boost_range_begin( const wchar_t*& s )
williamr@2
   127
    {
williamr@2
   128
        return s;
williamr@2
   129
    }
williamr@2
   130
williamr@2
   131
    inline wchar_t* boost_range_begin( wchar_t*& s )
williamr@2
   132
    {
williamr@2
   133
        return 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
williamr@2
   144
template< class T >
williamr@2
   145
inline BOOST_DEDUCED_TYPENAME range_iterator<
williamr@2
   146
                        typename remove_const<T>::type >::type begin( T& r )
williamr@2
   147
{
williamr@2
   148
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
   149
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
   150
    /**/
williamr@2
   151
    using namespace range_detail;
williamr@2
   152
#endif
williamr@2
   153
    return boost_range_begin( r );
williamr@2
   154
}
williamr@2
   155
williamr@2
   156
template< class T >
williamr@2
   157
inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type begin( const T& r )
williamr@2
   158
{
williamr@2
   159
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
williamr@2
   160
    !BOOST_WORKAROUND(__GNUC__, < 3) \
williamr@2
   161
    /**/
williamr@2
   162
    using namespace range_detail;
williamr@2
   163
#endif
williamr@2
   164
    return boost_range_begin( r );
williamr@2
   165
}
williamr@2
   166
williamr@2
   167
#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
williamr@2
   168
// BCB and CW are not able to overload pointer when class overloads are also available.
williamr@2
   169
template<>
williamr@2
   170
inline range_const_iterator<const char*>::type begin<const char*>( const char*& r )
williamr@2
   171
{
williamr@2
   172
    return r;
williamr@2
   173
}
williamr@2
   174
williamr@2
   175
template<>
williamr@2
   176
inline range_const_iterator<const wchar_t*>::type begin<const wchar_t*>( const wchar_t*& r )
williamr@2
   177
{
williamr@2
   178
    return r;
williamr@2
   179
}
williamr@2
   180
williamr@2
   181
#endif
williamr@2
   182
williamr@2
   183
} // namespace boost
williamr@2
   184
williamr@2
   185
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
williamr@2
   186
williamr@2
   187
namespace boost
williamr@2
   188
{
williamr@2
   189
    template< class T >
williamr@2
   190
    inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type
williamr@2
   191
    const_begin( const T& r )
williamr@2
   192
    {
williamr@2
   193
        return boost::begin( r );
williamr@2
   194
    }
williamr@2
   195
}
williamr@2
   196
williamr@2
   197
#endif