/*=============================================================================

    Copyright (c) 2001-2006 Joel de Guzman



    Distributed under 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)

==============================================================================*/

#if !defined(FUSION_NEXT_05042005_1101)

#define FUSION_NEXT_05042005_1101



#include <boost/fusion/support/tag_of.hpp>



namespace boost { namespace fusion

{

    // Special tags:

    struct iterator_facade_tag; // iterator facade tag

    struct array_iterator_tag; // boost::array iterator tag

    struct mpl_iterator_tag; // mpl sequence iterator tag

    struct std_pair_iterator_tag; // std::pair iterator tag



    namespace extension

    {

        template <typename Tag>

        struct next_impl

        {

            template <typename Iterator>

            struct apply {};

        };



        template <>

        struct next_impl<iterator_facade_tag>

        {

            template <typename Iterator>

            struct apply : Iterator::template next<Iterator> {};

        };



        template <>

        struct next_impl<array_iterator_tag>;



        template <>

        struct next_impl<mpl_iterator_tag>;



        template <>

        struct next_impl<std_pair_iterator_tag>;

    }



    namespace result_of

    {

        template <typename Iterator>

        struct next

            : extension::next_impl<typename detail::tag_of<Iterator>::type>::

                template apply<Iterator>

        {};

    }



    template <typename Iterator>

    typename result_of::next<Iterator>::type const

    next(Iterator const& i)

    {

        return result_of::next<Iterator>::call(i);

    }

}}



#endif

