Line data Source code
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) 15 : # pragma once 16 : #endif 17 : 18 : #include <boost/range/config.hpp> 19 : 20 : #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 21 : #include <boost/range/detail/end.hpp> 22 : #else 23 : 24 : #include <boost/range/detail/implementation_help.hpp> 25 : #include <boost/range/iterator.hpp> 26 : #include <boost/range/const_iterator.hpp> 27 : #include <boost/config.hpp> 28 : #include <boost/config/workaround.hpp> 29 : 30 : namespace boost 31 : { 32 : 33 : #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) 34 : namespace range_detail 35 : { 36 : #endif 37 : 38 : ////////////////////////////////////////////////////////////////////// 39 : // primary template 40 : ////////////////////////////////////////////////////////////////////// 41 : template< typename C > 42 : BOOST_CONSTEXPR inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type 43 422149 : range_end( C& c ) 44 : { 45 : // 46 : // If you get a compile-error here, it is most likely because 47 : // you have not implemented range_begin() properly in 48 : // the namespace of C 49 : // 50 421077 : return c.end(); 51 : } 52 : 53 : ////////////////////////////////////////////////////////////////////// 54 : // pair 55 : ////////////////////////////////////////////////////////////////////// 56 : 57 : template< typename Iterator > 58 0 : BOOST_CONSTEXPR inline Iterator range_end( const std::pair<Iterator,Iterator>& p ) 59 : { 60 : return p.second; 61 : } 62 : 63 : template< typename Iterator > 64 : BOOST_CONSTEXPR inline Iterator range_end( std::pair<Iterator,Iterator>& p ) 65 : { 66 : return p.second; 67 : } 68 : 69 : ////////////////////////////////////////////////////////////////////// 70 : // array 71 : ////////////////////////////////////////////////////////////////////// 72 : 73 : template< typename T, std::size_t sz > 74 : BOOST_CONSTEXPR inline const T* range_end( const T (&a)[sz] ) BOOST_NOEXCEPT 75 : { 76 : return range_detail::array_end<T,sz>( a ); 77 : } 78 : 79 : template< typename T, std::size_t sz > 80 : BOOST_CONSTEXPR inline T* range_end( T (&a)[sz] ) BOOST_NOEXCEPT 81 : { 82 : return range_detail::array_end<T,sz>( a ); 83 : } 84 : 85 : #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) 86 : } // namespace 'range_detail' 87 : #endif 88 : 89 : namespace range_adl_barrier 90 : { 91 : 92 : template< class T > 93 : #if !BOOST_WORKAROUND(BOOST_GCC, < 40700) 94 : BOOST_CONSTEXPR 95 : #endif 96 279484 : inline BOOST_DEDUCED_TYPENAME range_iterator<T>::type end( T& r ) 97 : { 98 : #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) 99 : using namespace range_detail; 100 : #endif 101 279484 : return range_end( r ); 102 : } 103 : 104 : template< class T > 105 : #if !BOOST_WORKAROUND(BOOST_GCC, < 40700) 106 : BOOST_CONSTEXPR 107 : #endif 108 337303 : inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type end( const T& r ) 109 : { 110 : #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) 111 : using namespace range_detail; 112 : #endif 113 337303 : return range_end( r ); 114 : } 115 : 116 : } // namespace range_adl_barrier 117 : } // namespace 'boost' 118 : 119 : #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING 120 : 121 : namespace boost 122 : { 123 : namespace range_adl_barrier 124 : { 125 : template< class T > 126 : BOOST_CONSTEXPR inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type 127 : const_end( const T& r ) 128 : { 129 : return boost::range_adl_barrier::end( r ); 130 : } 131 : } // namespace range_adl_barrier 132 : using namespace range_adl_barrier; 133 : } // namespace boost 134 : 135 : #endif 136 :