// Boost.Range library

//

//  Copyright Thorsten Ottosen 2003-2004. Use, modification and

//  distribution is subject to the Boost Software License, Version

//  1.0. (See accompanying file LICENSE_1_0.txt or copy at

//  http://www.boost.org/LICENSE_1_0.txt)

//

// For more information, see http://www.boost.org/libs/range/

//



#ifndef BOOST_RANGE_END_HPP

#define BOOST_RANGE_END_HPP



#if defined(_MSC_VER) && (_MSC_VER >= 1200)

# pragma once

#endif



#include <boost/range/config.hpp>



#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING

#include <boost/range/detail/end.hpp>

#else



#include <boost/range/detail/implementation_help.hpp>

#include <boost/range/iterator.hpp>

#include <boost/range/const_iterator.hpp>



namespace boost

{



#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \

    !BOOST_WORKAROUND(__GNUC__, < 3) \

    /**/

namespace range_detail

{

#endif



        //////////////////////////////////////////////////////////////////////

        // primary template

        //////////////////////////////////////////////////////////////////////

        template< typename C >

        inline BOOST_DEDUCED_TYPENAME range_iterator<C>::type

        range_end( C& c )

        {

            //

            // If you get a compile-error here, it is most likely because

            // you have not implemented range_begin() properly in

            // the namespace of C

            //

            return c.end();

        }



        //////////////////////////////////////////////////////////////////////

        // pair

        //////////////////////////////////////////////////////////////////////



        template< typename Iterator >

        inline Iterator range_end( const std::pair<Iterator,Iterator>& p )

        {

            return p.second;

        }



        template< typename Iterator >

        inline Iterator range_end( std::pair<Iterator,Iterator>& p )

        {

            return p.second;

        }



        //////////////////////////////////////////////////////////////////////

        // array

        //////////////////////////////////////////////////////////////////////



        template< typename T, std::size_t sz >

        inline const T* range_end( const T (&array)[sz] )

        {

            return range_detail::array_end<T,sz>( array );

        }



        template< typename T, std::size_t sz >

        inline T* range_end( T (&array)[sz] )

        {

            return range_detail::array_end<T,sz>( array );

        }



#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \

    !BOOST_WORKAROUND(__GNUC__, < 3) \

    /**/

} // namespace 'range_detail'

#endif



template< class T >

inline BOOST_DEDUCED_TYPENAME range_iterator<T>::type end( T& r )

{

#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \

    !BOOST_WORKAROUND(__GNUC__, < 3) \

    /**/

    using namespace range_detail;

#endif

    return range_end( r );

}



template< class T >

inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type end( const T& r )

{

#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \

    !BOOST_WORKAROUND(__GNUC__, < 3) \

    /**/

    using namespace range_detail;

#endif

    return range_end( r );

}



} // namespace 'boost'







#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING





namespace boost

{

    template< class T >

    inline BOOST_DEDUCED_TYPENAME range_iterator<const T>::type

    const_end( const T& r )

    {

        return boost::end( r );

    }

}



#endif



