diff options
Diffstat (limited to 'boost/fusion/container/map/map_iterator.hpp')
-rw-r--r-- | boost/fusion/container/map/map_iterator.hpp | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/boost/fusion/container/map/map_iterator.hpp b/boost/fusion/container/map/map_iterator.hpp index 1c03d8eb9e..b229cf552b 100644 --- a/boost/fusion/container/map/map_iterator.hpp +++ b/boost/fusion/container/map/map_iterator.hpp @@ -12,6 +12,10 @@ #include <boost/fusion/iterator/iterator_facade.hpp> #include <boost/mpl/minus.hpp> #include <boost/mpl/equal_to.hpp> +#include <boost/mpl/if.hpp> +#include <boost/utility/declval.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/type_traits/add_const.hpp> namespace boost { namespace fusion { @@ -26,7 +30,7 @@ namespace boost { namespace fusion typedef Seq sequence; typedef mpl::int_<Pos> index; - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED map_iterator(Seq& seq) : seq_(seq) {} @@ -37,7 +41,7 @@ namespace boost { namespace fusion typedef typename Iterator::sequence sequence; typedef typename Iterator::index index; typedef - decltype(std::declval<sequence>().get_val(index())) + decltype(boost::declval<sequence>().get_val(index())) type; }; @@ -47,7 +51,7 @@ namespace boost { namespace fusion typedef typename Iterator::sequence sequence; typedef typename Iterator::index index; typedef - decltype(std::declval<sequence>().get_val(index()).second) + decltype(boost::declval<sequence>().get_val(index()).second) type; }; @@ -56,7 +60,7 @@ namespace boost { namespace fusion { typedef typename Iterator::sequence sequence; typedef typename Iterator::index index; - typedef decltype(std::declval<sequence>().get_key(index())) key_identity_type; + typedef decltype(boost::declval<sequence>().get_key(index())) key_identity_type; typedef typename key_identity_type::type type; }; @@ -66,10 +70,10 @@ namespace boost { namespace fusion typedef typename Iterator::sequence sequence; typedef typename Iterator::index index; typedef - decltype(std::declval<sequence>().get(index())) + decltype(boost::declval<sequence>().get(index())) type; - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static type call(Iterator const& it) { @@ -82,11 +86,20 @@ namespace boost { namespace fusion { typedef typename Iterator::sequence sequence; typedef typename Iterator::index index; - typedef - decltype(std::declval<sequence>().get(index()).second) - type; - BOOST_FUSION_GPU_ENABLED + typedef decltype(boost::declval<sequence>().get(index()).second) second_type_; + + typedef typename + mpl::if_< + is_const<sequence> + , typename add_const<second_type_>::type + , second_type_ + >::type + second_type; + + typedef typename add_reference<second_type>::type type; + + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static type call(Iterator const& it) { @@ -101,7 +114,7 @@ namespace boost { namespace fusion typedef typename Iterator::sequence sequence; typedef map_iterator<sequence, index::value + N::value> type; - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static type call(Iterator const& i) { @@ -128,7 +141,7 @@ namespace boost { namespace fusion >::type type; - BOOST_FUSION_GPU_ENABLED + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static type call(I1 const&, I2 const&) { @@ -150,4 +163,13 @@ namespace boost { namespace fusion }} +#ifdef BOOST_FUSION_WORKAROUND_FOR_LWG_2408 +namespace std +{ + template <typename Seq, int Pos> + struct iterator_traits< ::boost::fusion::map_iterator<Seq, Pos> > + { }; +} +#endif + #endif |