Files

136 lines
3.9 KiB
C++
Raw Permalink Normal View History

2007-10-21 00:52:09 +00:00
/*=============================================================================
2012-04-07 07:34:00 +00:00
Copyright (c) 2005-2012 Joel de Guzman
2007-10-21 00:52:09 +00:00
Copyright (c) 2005-2006 Dan Marsden
2012-04-07 09:56:07 +00:00
Distributed under the Boost Software License, Version 1.0. (See accompanying
2007-10-21 00:52:09 +00:00
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#if !defined(BOOST_FUSION_DEQUE_ITERATOR_26112006_2154)
#define BOOST_FUSION_DEQUE_ITERATOR_26112006_2154
2014-01-09 17:58:06 -08:00
#include <boost/fusion/support/config.hpp>
2007-10-21 00:52:09 +00:00
#include <boost/fusion/iterator/iterator_facade.hpp>
#include <boost/fusion/container/deque/detail/keyed_element.hpp>
2014-11-21 00:53:50 +09:00
#include <boost/mpl/int.hpp>
2007-10-21 00:52:09 +00:00
#include <boost/mpl/minus.hpp>
#include <boost/mpl/equal_to.hpp>
2014-11-21 00:53:50 +09:00
#include <boost/mpl/identity.hpp>
#include <boost/mpl/if.hpp>
2012-04-07 09:56:07 +00:00
#include <boost/type_traits/is_const.hpp>
2014-11-21 00:53:50 +09:00
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/add_reference.hpp>
2007-10-21 00:52:09 +00:00
2022-09-26 08:11:49 +08:00
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable: 4512) // assignment operator could not be generated.
#endif
2007-10-21 00:52:09 +00:00
namespace boost { namespace fusion {
struct bidirectional_traversal_tag;
2012-04-07 09:56:07 +00:00
template <typename Seq, int Pos>
2007-10-21 00:52:09 +00:00
struct deque_iterator
: iterator_facade<deque_iterator<Seq, Pos>, bidirectional_traversal_tag>
{
typedef Seq sequence;
typedef mpl::int_<Pos> index;
2015-03-03 02:21:02 +09:00
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
2007-10-21 00:52:09 +00:00
deque_iterator(Seq& seq)
: seq_(seq)
{}
template<typename Iterator>
struct value_of
: detail::keyed_element_value_at<
typename Iterator::sequence, typename Iterator::index>
{};
template<typename Iterator>
struct deref
{
typedef typename detail::keyed_element_value_at<
typename Iterator::sequence, typename Iterator::index>::type element_type;
typedef typename add_reference<
typename mpl::eval_if<
is_const<typename Iterator::sequence>,
add_const<element_type>,
mpl::identity<element_type> >::type>::type type;
2015-03-03 02:21:02 +09:00
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
2007-10-21 00:52:09 +00:00
static type
call(Iterator const& it)
{
return it.seq_.get(typename Iterator::index());
}
};
template <typename Iterator, typename N>
struct advance
{
typedef typename Iterator::index index;
typedef typename Iterator::sequence sequence;
typedef deque_iterator<sequence, index::value + N::value> type;
2015-03-03 02:21:02 +09:00
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
2007-10-21 00:52:09 +00:00
static type
call(Iterator const& i)
{
return type(i.seq_);
}
};
template<typename Iterator>
struct next
: advance<Iterator, mpl::int_<1> >
{};
template<typename Iterator>
struct prior
: advance<Iterator, mpl::int_<-1> >
{};
template <typename I1, typename I2>
struct distance : mpl::minus<typename I2::index, typename I1::index>
{
typedef typename
mpl::minus<
typename I2::index, typename I1::index
2012-04-07 09:56:07 +00:00
>::type
2007-10-21 00:52:09 +00:00
type;
2015-03-03 02:21:02 +09:00
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
2007-10-21 00:52:09 +00:00
static type
call(I1 const&, I2 const&)
{
return type();
}
};
template<typename I1, typename I2>
struct equal_to
: mpl::equal_to<typename I1::index, typename I2::index>
{};
Seq& seq_;
};
}}
2022-09-26 08:11:49 +08:00
#ifdef _MSC_VER
# pragma warning(pop)
#endif
#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408
namespace std
{
template <typename Seq, int Pos>
struct iterator_traits< ::boost::fusion::deque_iterator<Seq, Pos> >
{ };
}
#endif
2007-10-21 00:52:09 +00:00
#endif