1 /*=============================================================================
2 Copyright (c) 2005-2012 Joel de Guzman
3 Copyright (c) 2005-2006 Dan Marsden
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #if !defined(BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330)
9 #define BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330
11 #include <boost/fusion/support/config.hpp>
12 #include <boost/fusion/support/detail/access.hpp>
13 #include <boost/fusion/iterator/deref.hpp>
14 #include <boost/fusion/iterator/next.hpp>
16 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && BOOST_WORKAROUND(BOOST_GCC, / 100 == 404)
17 #include <boost/core/enable_if.hpp>
18 #include <boost/type_traits/is_same.hpp>
21 namespace boost { namespace fusion
23 struct fusion_sequence_tag;
26 namespace boost { namespace fusion { namespace detail
28 struct nil_keyed_element
30 typedef fusion_sequence_tag tag;
31 BOOST_FUSION_GPU_ENABLED
35 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
36 static nil_keyed_element
37 from_iterator(It const&)
39 return nil_keyed_element();
43 template <typename Key, typename Value, typename Rest>
44 struct keyed_element : Rest
47 typedef fusion_sequence_tag tag;
50 template <typename It>
51 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
53 from_iterator(It const& it)
56 *it, base::from_iterator(fusion::next(it)));
59 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
60 keyed_element(keyed_element const& rhs)
61 : Rest(rhs.get_base()), value_(rhs.value_)
64 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
65 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
66 keyed_element(keyed_element&& rhs)
67 : Rest(rhs.forward_base())
68 , value_(BOOST_FUSION_FWD_ELEM(Value, rhs.value_))
72 template <typename U, typename Rst>
73 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
74 keyed_element(keyed_element<Key, U, Rst> const& rhs
75 , typename enable_if<is_convertible<U, Value> >::type* = 0)
76 : Rest(rhs.get_base()), value_(rhs.value_)
79 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
82 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
83 Rest& get_base() BOOST_NOEXCEPT
88 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
89 Rest const& get_base() const BOOST_NOEXCEPT
94 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
95 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
96 Rest&& forward_base() BOOST_NOEXCEPT
98 return std::move(*static_cast<Rest*>(this));
102 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
103 typename cref_result<Value>::type get(Key) const
108 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
109 typename ref_result<Value>::type get(Key)
114 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
116 typename detail::call_param<Value>::type value
118 : Rest(rest), value_(value)
121 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
122 #if BOOST_WORKAROUND(BOOST_GCC, / 100 == 404)
123 template <typename Value_, typename = typename enable_if<is_same<Value_, Value> >::type>
125 typedef Value Value_;
127 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
128 keyed_element(Value_&& value, Rest&& rest)
129 : Rest(std::move(rest))
130 , value_(BOOST_FUSION_FWD_ELEM(Value, value))
134 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
139 template<typename U, typename Rst>
140 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
141 keyed_element& operator=(keyed_element<Key, U, Rst> const& rhs)
143 base::operator=(static_cast<Rst const&>(rhs)); // cast for msvc-7.1
148 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
149 keyed_element& operator=(keyed_element const& rhs)
151 base::operator=(rhs);
156 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
157 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
158 keyed_element& operator=(keyed_element&& rhs)
160 base::operator=(rhs.forward_base());
161 value_ = std::move(rhs.value_);
169 template<typename Elem, typename Key>
170 struct keyed_element_value_at
171 : keyed_element_value_at<typename Elem::base, Key>
174 template<typename Key, typename Value, typename Rest>
175 struct keyed_element_value_at<keyed_element<Key, Value, Rest>, Key>