epoc32/include/stdapis/boost/range/detail/implementation_help.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
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_DETAIL_IMPLEMENTATION_HELP_HPP
williamr@2
    12
#define BOOST_RANGE_DETAIL_IMPLEMENTATION_HELP_HPP
williamr@2
    13
williamr@2
    14
#include <boost/range/config.hpp>
williamr@2
    15
#include <boost/range/detail/common.hpp>
williamr@2
    16
#include <boost/type_traits/is_same.hpp>
williamr@2
    17
#include <cstddef>
williamr@2
    18
#include <string.h>
williamr@2
    19
williamr@2
    20
#ifndef BOOST_NO_CWCHAR
williamr@2
    21
#include <wchar.h>
williamr@2
    22
#endif
williamr@2
    23
williamr@2
    24
namespace boost 
williamr@2
    25
{
williamr@2
    26
    namespace range_detail
williamr@2
    27
    {
williamr@2
    28
        
williamr@2
    29
        /////////////////////////////////////////////////////////////////////
williamr@2
    30
        // end() help
williamr@2
    31
        /////////////////////////////////////////////////////////////////////
williamr@2
    32
williamr@2
    33
        inline const char* str_end( const char* s, const char* )
williamr@2
    34
        {
williamr@2
    35
            return s + strlen( s );
williamr@2
    36
        }
williamr@2
    37
        
williamr@2
    38
#ifndef BOOST_NO_CWCHAR
williamr@2
    39
        inline const wchar_t* str_end( const wchar_t* s, const wchar_t* )
williamr@2
    40
        {
williamr@2
    41
            return s + wcslen( s );
williamr@2
    42
        }
williamr@2
    43
#else
williamr@2
    44
        inline const wchar_t* str_end( const wchar_t* s, const wchar_t* )
williamr@2
    45
        {
williamr@2
    46
            if( s == 0 || s[0] == 0 )
williamr@2
    47
                return s;
williamr@2
    48
            while( *++s != 0 )
williamr@2
    49
                ;
williamr@2
    50
            return s;
williamr@2
    51
        }
williamr@2
    52
#endif         
williamr@2
    53
williamr@2
    54
        template< class Char >
williamr@2
    55
        inline Char* str_end( Char* s )
williamr@2
    56
        {
williamr@2
    57
            return const_cast<Char*>( str_end( s, s ) );
williamr@2
    58
        }
williamr@2
    59
williamr@2
    60
        template< class T, std::size_t sz >
williamr@2
    61
        inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], int )
williamr@2
    62
        {
williamr@2
    63
            return boost_range_array + sz;
williamr@2
    64
        }
williamr@2
    65
        
williamr@2
    66
        template< class T, std::size_t sz >
williamr@2
    67
        inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], int )
williamr@2
    68
        {
williamr@2
    69
            return boost_range_array + sz;
williamr@2
    70
        }
williamr@2
    71
williamr@2
    72
        template< class T, std::size_t sz >
williamr@2
    73
        inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
williamr@2
    74
        {
williamr@2
    75
            return boost_range_array + sz - 1;
williamr@2
    76
        }
williamr@2
    77
        
williamr@2
    78
        template< class T, std::size_t sz >
williamr@2
    79
        inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
williamr@2
    80
        {
williamr@2
    81
            return boost_range_array + sz - 1;
williamr@2
    82
        }
williamr@2
    83
williamr@2
    84
        template< class T, std::size_t sz >
williamr@2
    85
        inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz] )
williamr@2
    86
        {
williamr@2
    87
            typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
williamr@2
    88
                                                                char_or_wchar_t_array_tag,
williamr@2
    89
                                                                int >::type tag;
williamr@2
    90
williamr@2
    91
            return array_end<T,sz>( boost_range_array, tag() );
williamr@2
    92
        }
williamr@2
    93
        
williamr@2
    94
        template< class T, std::size_t sz >
williamr@2
    95
        inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz] )
williamr@2
    96
        {
williamr@2
    97
            typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
williamr@2
    98
                                                                char_or_wchar_t_array_tag,
williamr@2
    99
                                                                int >::type tag;
williamr@2
   100
        
williamr@2
   101
            return array_end<T,sz>( boost_range_array, tag() );
williamr@2
   102
        }
williamr@2
   103
williamr@2
   104
        /////////////////////////////////////////////////////////////////////
williamr@2
   105
        // size() help
williamr@2
   106
        /////////////////////////////////////////////////////////////////////
williamr@2
   107
        
williamr@2
   108
        template< class Char >
williamr@2
   109
        inline std::size_t str_size( const Char* const& s )
williamr@2
   110
        {
williamr@2
   111
            return str_end( s ) - s;
williamr@2
   112
        }
williamr@2
   113
         
williamr@2
   114
        template< class T, std::size_t sz >
williamr@2
   115
        inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], int )
williamr@2
   116
        {
williamr@2
   117
            return sz;
williamr@2
   118
        }
williamr@2
   119
       
williamr@2
   120
        template< class T, std::size_t sz >
williamr@2
   121
        inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], int )
williamr@2
   122
        {
williamr@2
   123
            return sz;
williamr@2
   124
        }
williamr@2
   125
williamr@2
   126
        template< class T, std::size_t sz >
williamr@2
   127
        inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
williamr@2
   128
        {
williamr@2
   129
            return sz - 1;
williamr@2
   130
        }
williamr@2
   131
                 
williamr@2
   132
        template< class T, std::size_t sz >
williamr@2
   133
        inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag )
williamr@2
   134
        {
williamr@2
   135
            return sz - 1;
williamr@2
   136
        }
williamr@2
   137
williamr@2
   138
        template< class T, std::size_t sz >
williamr@2
   139
        inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz] )
williamr@2
   140
        {
williamr@2
   141
            typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<const char,T>::value || is_same<const wchar_t,T>::value ||
williamr@2
   142
                                                                   is_same<char,T>::value       || is_same<wchar_t,T>::value,
williamr@2
   143
                                                                char_or_wchar_t_array_tag,
williamr@2
   144
                                                                int >::type tag;
williamr@2
   145
            return array_size<T,sz>( boost_range_array, tag() );
williamr@2
   146
        }
williamr@2
   147
williamr@2
   148
        template< class T, std::size_t sz >
williamr@2
   149
        inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz] )
williamr@2
   150
        {
williamr@2
   151
            typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same<char,T>::value || is_same<wchar_t,T>::value,
williamr@2
   152
                                                                char_or_wchar_t_array_tag,
williamr@2
   153
                                                                int >::type tag;
williamr@2
   154
            return array_size<T,sz>( boost_range_array, tag() );
williamr@2
   155
        }
williamr@2
   156
williamr@2
   157
    } // namespace 'range_detail'
williamr@2
   158
    
williamr@2
   159
} // namespace 'boost'
williamr@2
   160
williamr@2
   161
williamr@2
   162
#endif