williamr@2: // Boost.Range library williamr@2: // williamr@2: // Copyright Thorsten Ottosen 2003-2004. Use, modification and williamr@2: // distribution is subject to the Boost Software License, Version williamr@2: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // For more information, see http://www.boost.org/libs/range/ williamr@2: // williamr@2: williamr@2: #ifndef BOOST_RANGE_DETAIL_IMPLEMENTATION_HELP_HPP williamr@2: #define BOOST_RANGE_DETAIL_IMPLEMENTATION_HELP_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #ifndef BOOST_NO_CWCHAR williamr@2: #include williamr@2: #endif williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: namespace range_detail williamr@2: { williamr@2: williamr@2: ///////////////////////////////////////////////////////////////////// williamr@2: // end() help williamr@2: ///////////////////////////////////////////////////////////////////// williamr@2: williamr@2: inline const char* str_end( const char* s, const char* ) williamr@2: { williamr@2: return s + strlen( s ); williamr@2: } williamr@2: williamr@2: #ifndef BOOST_NO_CWCHAR williamr@2: inline const wchar_t* str_end( const wchar_t* s, const wchar_t* ) williamr@2: { williamr@2: return s + wcslen( s ); williamr@2: } williamr@2: #else williamr@2: inline const wchar_t* str_end( const wchar_t* s, const wchar_t* ) williamr@2: { williamr@2: if( s == 0 || s[0] == 0 ) williamr@2: return s; williamr@2: while( *++s != 0 ) williamr@2: ; williamr@2: return s; williamr@2: } williamr@2: #endif williamr@2: williamr@2: template< class Char > williamr@2: inline Char* str_end( Char* s ) williamr@2: { williamr@2: return const_cast( str_end( s, s ) ); williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], int ) williamr@2: { williamr@2: return boost_range_array + sz; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], int ) williamr@2: { williamr@2: return boost_range_array + sz; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag ) williamr@2: { williamr@2: return boost_range_array + sz - 1; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag ) williamr@2: { williamr@2: return boost_range_array + sz - 1; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline T* array_end( T BOOST_RANGE_ARRAY_REF()[sz] ) williamr@2: { williamr@2: typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same::value || is_same::value, williamr@2: char_or_wchar_t_array_tag, williamr@2: int >::type tag; williamr@2: williamr@2: return array_end( boost_range_array, tag() ); williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline const T* array_end( const T BOOST_RANGE_ARRAY_REF()[sz] ) williamr@2: { williamr@2: typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same::value || is_same::value, williamr@2: char_or_wchar_t_array_tag, williamr@2: int >::type tag; williamr@2: williamr@2: return array_end( boost_range_array, tag() ); williamr@2: } williamr@2: williamr@2: ///////////////////////////////////////////////////////////////////// williamr@2: // size() help williamr@2: ///////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< class Char > williamr@2: inline std::size_t str_size( const Char* const& s ) williamr@2: { williamr@2: return str_end( s ) - s; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], int ) williamr@2: { williamr@2: return sz; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], int ) williamr@2: { williamr@2: return sz; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag ) williamr@2: { williamr@2: return sz - 1; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz], char_or_wchar_t_array_tag ) williamr@2: { williamr@2: return sz - 1; williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( T BOOST_RANGE_ARRAY_REF()[sz] ) williamr@2: { williamr@2: typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same::value || is_same::value || williamr@2: is_same::value || is_same::value, williamr@2: char_or_wchar_t_array_tag, williamr@2: int >::type tag; williamr@2: return array_size( boost_range_array, tag() ); williamr@2: } williamr@2: williamr@2: template< class T, std::size_t sz > williamr@2: inline std::size_t array_size( const T BOOST_RANGE_ARRAY_REF()[sz] ) williamr@2: { williamr@2: typedef BOOST_RANGE_DEDUCED_TYPENAME boost::mpl::if_c< is_same::value || is_same::value, williamr@2: char_or_wchar_t_array_tag, williamr@2: int >::type tag; williamr@2: return array_size( boost_range_array, tag() ); williamr@2: } williamr@2: williamr@2: } // namespace 'range_detail' williamr@2: williamr@2: } // namespace 'boost' williamr@2: williamr@2: williamr@2: #endif