/*============================================================================= | |
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_ITERATOR_FACADE_09252006_1011) | |
#define FUSION_ITERATOR_FACADE_09252006_1011 | |
#include <boost/fusion/support/iterator_base.hpp> | |
#include <boost/fusion/iterator/detail/advance.hpp> | |
#include <boost/fusion/iterator/detail/distance.hpp> | |
#include <boost/fusion/support/category_of.hpp> | |
#include <boost/type_traits/is_same.hpp> | |
#include <boost/mpl/assert.hpp> | |
namespace boost { namespace fusion | |
{ | |
struct iterator_facade_tag; | |
template <typename Derived, typename Category> | |
struct iterator_facade : iterator_base<Derived> | |
{ | |
typedef iterator_facade_tag fusion_tag; | |
typedef Derived derived_type; | |
typedef Category category; | |
// default implementation | |
template <typename I1, typename I2> | |
struct equal_to // default implementation | |
: is_same< | |
typename I1::derived_type | |
, typename I2::derived_type | |
> | |
{}; | |
// default implementation | |
template <typename Iterator, typename N> | |
struct advance : | |
mpl::if_c< | |
(N::value > 0) | |
, advance_detail::forward<Iterator, N::value> | |
, advance_detail::backward<Iterator, N::value> | |
>::type | |
{ | |
BOOST_MPL_ASSERT_NOT((traits::is_random_access<Iterator>)); | |
}; | |
// default implementation | |
template <typename First, typename Last> | |
struct distance : | |
distance_detail::linear_distance<First, Last> | |
{}; | |
}; | |
}} | |
#endif |