summaryrefslogtreecommitdiff
path: root/boost/fusion/container/map/map_iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/container/map/map_iterator.hpp')
-rw-r--r--boost/fusion/container/map/map_iterator.hpp46
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