|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r73686 - trunk/boost/fusion/algorithm/transformation
From: joel_at_[hidden]
Date: 2011-08-12 01:14:07
Author: djowel
Date: 2011-08-12 01:14:06 EDT (Fri, 12 Aug 2011)
New Revision: 73686
URL: http://svn.boost.org/trac/boost/changeset/73686
Log:
revert the implementation to previous version, but changed it such that prior is not used. used advance instead which is ok for forward iterators.
Text files modified:
trunk/boost/fusion/algorithm/transformation/pop_back.hpp | 82 ++++++---------------------------------
1 files changed, 13 insertions(+), 69 deletions(-)
Modified: trunk/boost/fusion/algorithm/transformation/pop_back.hpp
==============================================================================
--- trunk/boost/fusion/algorithm/transformation/pop_back.hpp (original)
+++ trunk/boost/fusion/algorithm/transformation/pop_back.hpp 2011-08-12 01:14:06 EDT (Fri, 12 Aug 2011)
@@ -10,75 +10,22 @@
#include <boost/fusion/view/iterator_range/iterator_range.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
#include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/sequence/intrinsic/empty.hpp>
-#include <boost/fusion/iterator/iterator_adapter.hpp>
-#include <boost/fusion/iterator/next.hpp>
-#include <boost/mpl/minus.hpp>
-#include <boost/mpl/int.hpp>
+#include <boost/fusion/iterator/advance.hpp>
namespace boost { namespace fusion
{
- template <typename Iterator_>
- struct pop_back_iterator
- : iterator_adapter<
- pop_back_iterator<Iterator_>
- , Iterator_>
- {
- typedef iterator_adapter<
- pop_back_iterator<Iterator_>
- , Iterator_>
- base_type;
-
- pop_back_iterator(Iterator_ const& iterator_base)
- : base_type(iterator_base) {}
-
- template <typename BaseIterator>
- struct make
- {
- typedef pop_back_iterator<BaseIterator> type;
-
- static type
- call(BaseIterator const& i)
- {
- return type(i);
- }
- };
-
- template <typename I1, typename I2>
- struct equal_to
- : result_of::equal_to<
- typename result_of::next<
- typename I1::iterator_base_type>::type
- , typename I2::iterator_base_type
- >
- {};
-
- template <typename First, typename Last>
- struct distance
- : mpl::minus<
- typename result_of::distance<
- typename First::iterator_base_type
- , typename Last::iterator_base_type
- >::type
- , mpl::int_<1>
- >::type
- {};
- };
-
namespace result_of
{
template <typename Sequence>
struct pop_back
{
- BOOST_MPL_ASSERT_NOT((result_of::empty<Sequence>));
-
- typedef pop_back_iterator<
- typename begin<Sequence>::type>
- begin_type;
-
- typedef pop_back_iterator<
- typename end<Sequence>::type>
- end_type;
+ static int const size = size<Sequence>::value;
+ BOOST_STATIC_ASSERT(size > 0);
+ typedef typename begin<Sequence>::type begin_type;
+ typedef mpl::int_<size-1> end_index;
+ typedef typename advance<begin_type, end_index>::type end_type;
typedef
iterator_range<begin_type, end_type>
@@ -90,15 +37,12 @@
inline typename result_of::pop_back<Sequence const>::type
pop_back(Sequence const& seq)
{
- typedef result_of::pop_back<Sequence const> 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))
- );
+ typedef typename
+ result_of::pop_back<Sequence const>::end_index
+ end_index;
+
+ typedef typename result_of::pop_back<Sequence const>::type result;
+ return result(fusion::begin(seq), fusion::advance<end_index>(fusion::begin(seq)));
}
}}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk