Chris@16: /*============================================================================= Chris@16: Copyright (c) 2009 Christopher Schmidt Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: Chris@16: #ifndef BOOST_FUSION_ITERATOR_BASIC_ITERATOR_HPP Chris@16: #define BOOST_FUSION_ITERATOR_BASIC_ITERATOR_HPP Chris@16: Chris@101: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: namespace extension Chris@16: { Chris@16: template Chris@16: struct value_of_impl; Chris@16: Chris@16: template Chris@16: struct deref_impl; Chris@16: Chris@16: template Chris@16: struct value_of_data_impl; Chris@16: Chris@16: template Chris@16: struct key_of_impl; Chris@16: Chris@16: template Chris@16: struct deref_data_impl; Chris@16: } Chris@16: Chris@16: template Chris@16: struct basic_iterator Chris@101: : iterator_facade, Category> Chris@16: { Chris@16: typedef mpl::int_ index; Chris@16: typedef Seq seq_type; Chris@16: Chris@16: template Chris@16: struct value_of Chris@16: : extension::value_of_impl::template apply Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct deref Chris@16: : extension::deref_impl::template apply Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct value_of_data Chris@16: : extension::value_of_data_impl::template apply Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct key_of Chris@16: : extension::key_of_impl::template apply Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct deref_data Chris@16: : extension::deref_data_impl::template apply Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct advance Chris@16: { Chris@16: typedef Chris@16: basic_iterator Chris@16: type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static type Chris@16: call(It const& it) Chris@16: { Chris@16: return type(*it.seq,0); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct next Chris@16: : advance > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct prior Chris@16: : advance > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct distance Chris@16: { Chris@16: typedef mpl::minus type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Chris@16: type Chris@16: call(It1 const&, It2 const&) Chris@16: { Chris@16: return type(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct equal_to Chris@16: : mpl::and_< Chris@16: is_same< Chris@16: typename remove_const::type Chris@16: , typename remove_const::type Chris@16: > Chris@16: , mpl::equal_to Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: basic_iterator(basic_iterator const& it) Chris@16: : seq(it.seq) Chris@16: {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: basic_iterator(Seq& in_seq, int) Chris@16: : seq(&in_seq) Chris@16: {} Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: basic_iterator& Chris@16: operator=(basic_iterator const& it) Chris@16: { Chris@16: seq=it.seq; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: Seq* seq; Chris@16: }; Chris@16: }} Chris@16: Chris@101: #ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408 Chris@101: namespace std Chris@101: { Chris@101: template Chris@101: struct iterator_traits< ::boost::fusion::basic_iterator > Chris@101: { }; Chris@101: } Chris@16: #endif Chris@101: Chris@101: #endif