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