diff --git a/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp b/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp index 416880b4..40c5d79c 100644 --- a/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp +++ b/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp @@ -42,12 +42,18 @@ namespace boost { namespace fusion struct boost_tuple_is_empty const> : mpl::true_ {}; } + template + struct boost_tuple_iterator_identity; + template struct boost_tuple_iterator : iterator_facade, forward_traversal_tag> { typedef Cons cons_type; + typedef boost_tuple_iterator_identity< + typename add_const::type> identity; + BOOST_FUSION_GPU_ENABLED explicit boost_tuple_iterator(Cons& in_cons) : cons(in_cons) {} @@ -98,7 +104,7 @@ namespace boost { namespace fusion return type(iter.cons.get_tail()); } }; - + template struct distance; @@ -115,7 +121,7 @@ namespace boost { namespace fusion >::type >::type type; }; - + template struct distance { @@ -124,7 +130,7 @@ namespace boost { namespace fusion mpl::int_<0>, lazy_next_distance >::type type; - + BOOST_FUSION_GPU_ENABLED static type call(I1 const&, I2 const&) @@ -133,6 +139,11 @@ namespace boost { namespace fusion } }; + template + struct equal_to + : is_same + {}; + private: // silence MSVC warning C4512: assignment operator could not be generated boost_tuple_iterator& operator= (boost_tuple_iterator const&); @@ -144,6 +155,9 @@ namespace boost { namespace fusion { typedef Null cons_type; + typedef boost_tuple_iterator_identity< + typename add_const::type> identity; + template struct equal_to : mpl::or_< diff --git a/test/Jamfile b/test/Jamfile index 6e3ca32e..e74b7a95 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -60,6 +60,7 @@ project [ run sequence/as_set.cpp : : : : ] [ run sequence/as_vector.cpp : : : : ] [ run sequence/boost_tuple.cpp : : : : ] + [ run sequence/boost_tuple_iterator.cpp : : : : ] [ run sequence/cons.cpp : : : : ] [ run sequence/filter_view.cpp : : : : ] [ run sequence/hash.cpp : : : : ] diff --git a/test/sequence/boost_tuple_iterator.cpp b/test/sequence/boost_tuple_iterator.cpp new file mode 100644 index 00000000..3ab096b9 --- /dev/null +++ b/test/sequence/boost_tuple_iterator.cpp @@ -0,0 +1,21 @@ +/*============================================================================= + Copyright (c) 2014 Kohei Takahashi + + 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) +==============================================================================*/ + +#include + +#define FUSION_SEQUENCE boost::tuple +#define FUSION_TRAVERSAL_TAG forward_traversal_tag +#define FUSION_NO_PRIOR +#include "./iterator.hpp" + +int +main() +{ + test(); + return boost::report_errors(); +} +