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_END_HPP williamr@2: #define BOOST_RANGE_END_HPP williamr@2: williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1200) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@2: #include williamr@2: #else williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: williamr@2: #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \ williamr@2: !BOOST_WORKAROUND(__GNUC__, < 3) \ williamr@2: /**/ williamr@2: namespace range_detail williamr@2: { williamr@2: #endif williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: // primary template williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename C > williamr@2: inline BOOST_DEDUCED_TYPENAME range_const_iterator::type williamr@2: boost_range_end( const C& c ) williamr@2: { williamr@2: return c.end(); williamr@2: } williamr@2: williamr@2: template< typename C > williamr@2: inline BOOST_DEDUCED_TYPENAME range_iterator< williamr@2: typename remove_const::type >::type williamr@2: boost_range_end( C& c ) williamr@2: { williamr@2: return c.end(); williamr@2: } williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: // pair williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename Iterator > williamr@2: inline Iterator boost_range_end( const std::pair& p ) williamr@2: { williamr@2: return p.second; williamr@2: } williamr@2: williamr@2: template< typename Iterator > williamr@2: inline Iterator boost_range_end( std::pair& p ) williamr@2: { williamr@2: return p.second; williamr@2: } williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: // array williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename T, std::size_t sz > williamr@2: inline const T* boost_range_end( const T (&array)[sz] ) williamr@2: { williamr@2: return range_detail::array_end( array ); williamr@2: } williamr@2: williamr@2: template< typename T, std::size_t sz > williamr@2: inline T* boost_range_end( T (&array)[sz] ) williamr@2: { williamr@2: return range_detail::array_end( array ); williamr@2: } williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: // string williamr@2: ////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: #if 1 || BOOST_WORKAROUND(__MWERKS__, <= 0x3204 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) williamr@2: // CW up to 9.3 and borland have troubles with function ordering williamr@2: inline char* boost_range_end( char* s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline wchar_t* boost_range_end( wchar_t* s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline const char* boost_range_end( const char* s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline const wchar_t* boost_range_end( const wchar_t* s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: #else williamr@2: inline char* boost_range_end( char*& s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline wchar_t* boost_range_end( wchar_t*& s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline const char* boost_range_end( const char*& s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: williamr@2: inline const wchar_t* boost_range_end( const wchar_t*& s ) williamr@2: { williamr@2: return range_detail::str_end( s ); williamr@2: } williamr@2: #endif williamr@2: williamr@2: #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \ williamr@2: !BOOST_WORKAROUND(__GNUC__, < 3) \ williamr@2: /**/ williamr@2: } // namespace 'range_detail' williamr@2: #endif williamr@2: williamr@2: template< class T > williamr@2: inline BOOST_DEDUCED_TYPENAME range_iterator< williamr@2: typename remove_const::type >::type end( T& r ) williamr@2: { williamr@2: #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \ williamr@2: !BOOST_WORKAROUND(__GNUC__, < 3) \ williamr@2: /**/ williamr@2: using namespace range_detail; williamr@2: #endif williamr@2: return boost_range_end( r ); williamr@2: } williamr@2: williamr@2: template< class T > williamr@2: inline BOOST_DEDUCED_TYPENAME range_const_iterator::type end( const T& r ) williamr@2: { williamr@2: #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \ williamr@2: !BOOST_WORKAROUND(__GNUC__, < 3) \ williamr@2: /**/ williamr@2: using namespace range_detail; williamr@2: #endif williamr@2: return boost_range_end( r ); williamr@2: } williamr@2: williamr@2: williamr@2: williamr@2: #if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) williamr@2: // BCB and CW are not able to overload pointer when class overloads are also available. williamr@2: template<> williamr@2: inline range_const_iterator::type end( const char*& r ) williamr@2: { williamr@2: return range_detail::str_end( r ); williamr@2: } williamr@2: williamr@2: template<> williamr@2: inline range_const_iterator::type end( const wchar_t*& r ) williamr@2: { williamr@2: return range_detail::str_end( r ); williamr@2: } williamr@2: williamr@2: #endif williamr@2: williamr@2: } // namespace 'boost' williamr@2: williamr@2: williamr@2: williamr@2: #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@2: williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: template< class T > williamr@2: inline BOOST_DEDUCED_TYPENAME range_const_iterator::type williamr@2: const_end( const T& r ) williamr@2: { williamr@2: return boost::end( r ); williamr@2: } williamr@2: } williamr@2: williamr@2: #endif