/*============================================================================= Copyright (c) 2001-2011 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_POP_BACK_09172005_1038) #define FUSION_POP_BACK_09172005_1038 #include #include #include #include #include #include #include #include #include namespace boost { namespace fusion { template struct pop_back_iterator : iterator_adapter< pop_back_iterator , Iterator_> { typedef iterator_adapter< pop_back_iterator , Iterator_> base_type; static bool const is_last = IsLast; pop_back_iterator(Iterator_ const& iterator_base) : base_type(iterator_base) {} template struct make { typedef pop_back_iterator type; static type call(BaseIterator const& i) { return type(i); } }; template struct equal_to_helper : mpl::identity {}; template struct equal_to_helper : result_of::next< typename I::iterator_base_type> {}; template struct equal_to : result_of::equal_to< typename equal_to_helper::type , typename equal_to_helper::type > {}; template struct distance : mpl::minus< typename result_of::distance< typename First::iterator_base_type , typename Last::iterator_base_type >::type , mpl::int_<(Last::is_last?1:0)> >::type {}; template struct prior_impl { typedef typename Iterator::iterator_base_type base_type; typedef typename result_of::prior::type base_prior; typedef pop_back_iterator type; static type call(Iterator const& i) { return type(fusion::prior(i.iterator_base)); } }; template struct prior_impl { // If this is the last iterator, we'll have to double back typedef typename Iterator::iterator_base_type base_type; typedef typename result_of::prior< typename result_of::prior::type >::type base_prior; typedef pop_back_iterator type; static type call(Iterator const& i) { return type(fusion::prior( fusion::prior(i.iterator_base))); } }; template struct prior : prior_impl {}; }; namespace result_of { template struct pop_back { BOOST_MPL_ASSERT_NOT((result_of::empty)); typedef pop_back_iterator< typename begin::type, false> begin_type; typedef pop_back_iterator< typename end::type, true> end_type; typedef iterator_range type; }; } template inline typename result_of::pop_back::type pop_back(Sequence const& seq) { typedef result_of::pop_back comp; typedef typename comp::begin_type begin_type; typedef typename comp::end_type end_type; typedef typename comp::type result; return result( begin_type(fusion::begin(seq)) , end_type(fusion::end(seq)) ); } }} #endif