diff options
Diffstat (limited to 'boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp')
-rw-r--r-- | boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp b/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp index 416880b4e9..850eef5fa7 100644 --- a/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp +++ b/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp @@ -42,12 +42,18 @@ namespace boost { namespace fusion struct boost_tuple_is_empty<tuples::tuple<> const> : mpl::true_ {}; } + template <typename Cons> + struct boost_tuple_iterator_identity; + template <typename Cons = tuples::null_type> struct boost_tuple_iterator : iterator_facade<boost_tuple_iterator<Cons>, forward_traversal_tag> { typedef Cons cons_type; + typedef boost_tuple_iterator_identity< + typename add_const<Cons>::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 <typename I1, typename I2> struct distance; @@ -115,7 +121,7 @@ namespace boost { namespace fusion >::type >::type type; }; - + template <typename I1, typename I2> struct distance { @@ -124,7 +130,7 @@ namespace boost { namespace fusion mpl::int_<0>, lazy_next_distance<I1, I2> >::type type; - + BOOST_FUSION_GPU_ENABLED static type call(I1 const&, I2 const&) @@ -133,6 +139,11 @@ namespace boost { namespace fusion } }; + template <typename I1, typename I2> + struct equal_to + : is_same<typename I1::identity, typename I2::identity> + {}; + 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<Null>::type> identity; + template <typename I1, typename I2> struct equal_to : mpl::or_< @@ -193,6 +207,15 @@ namespace boost { namespace fusion }; }} +#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408 +namespace std +{ + template <typename Cons> + struct iterator_traits< ::boost::fusion::boost_tuple_iterator<Cons> > + { }; +} +#endif + #endif |