| /*============================================================================= |
| Copyright (c) 2005-2012 Joel de Guzman |
| Copyright (c) 2005-2006 Dan Marsden |
| |
| 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) |
| ==============================================================================*/ |
| #if !defined(BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330) |
| #define BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330 |
| |
| #include <boost/fusion/support/config.hpp> |
| #include <boost/fusion/support/detail/access.hpp> |
| #include <boost/fusion/iterator/deref.hpp> |
| #include <boost/fusion/iterator/next.hpp> |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && BOOST_WORKAROUND(BOOST_GCC, / 100 == 404) |
| #include <boost/core/enable_if.hpp> |
| #include <boost/type_traits/is_same.hpp> |
| #endif |
| |
| namespace boost { namespace fusion |
| { |
| struct fusion_sequence_tag; |
| }} |
| |
| namespace boost { namespace fusion { namespace detail |
| { |
| struct nil_keyed_element |
| { |
| typedef fusion_sequence_tag tag; |
| BOOST_FUSION_GPU_ENABLED |
| void get(); |
| |
| template<typename It> |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| static nil_keyed_element |
| from_iterator(It const&) |
| { |
| return nil_keyed_element(); |
| } |
| }; |
| |
| template <typename Key, typename Value, typename Rest> |
| struct keyed_element : Rest |
| { |
| typedef Rest base; |
| typedef fusion_sequence_tag tag; |
| using Rest::get; |
| |
| template <typename It> |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| static keyed_element |
| from_iterator(It const& it) |
| { |
| return keyed_element( |
| *it, base::from_iterator(fusion::next(it))); |
| } |
| |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element(keyed_element const& rhs) |
| : Rest(rhs.get_base()), value_(rhs.value_) |
| {} |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element(keyed_element&& rhs) |
| : Rest(rhs.forward_base()) |
| , value_(BOOST_FUSION_FWD_ELEM(Value, rhs.value_)) |
| {} |
| #endif |
| |
| template <typename U, typename Rst> |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element(keyed_element<Key, U, Rst> const& rhs |
| , typename enable_if<is_convertible<U, Value> >::type* = 0) |
| : Rest(rhs.get_base()), value_(rhs.value_) |
| {} |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
| #endif |
| |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| Rest& get_base() BOOST_NOEXCEPT |
| { |
| return *this; |
| } |
| |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| Rest const& get_base() const BOOST_NOEXCEPT |
| { |
| return *this; |
| } |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| Rest&& forward_base() BOOST_NOEXCEPT |
| { |
| return std::move(*static_cast<Rest*>(this)); |
| } |
| #endif |
| |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| typename cref_result<Value>::type get(Key) const |
| { |
| return value_; |
| } |
| |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| typename ref_result<Value>::type get(Key) |
| { |
| return value_; |
| } |
| |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element( |
| typename detail::call_param<Value>::type value |
| , Rest const& rest) |
| : Rest(rest), value_(value) |
| {} |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
| #if BOOST_WORKAROUND(BOOST_GCC, / 100 == 404) |
| template <typename Value_, typename = typename enable_if<is_same<Value_, Value> >::type> |
| #else |
| typedef Value Value_; |
| #endif |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element(Value_&& value, Rest&& rest) |
| : Rest(std::move(rest)) |
| , value_(BOOST_FUSION_FWD_ELEM(Value, value)) |
| {} |
| #endif |
| |
| BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element() |
| : Rest(), value_() |
| {} |
| |
| template<typename U, typename Rst> |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element& operator=(keyed_element<Key, U, Rst> const& rhs) |
| { |
| base::operator=(static_cast<Rst const&>(rhs)); // cast for msvc-7.1 |
| value_ = rhs.value_; |
| return *this; |
| } |
| |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element& operator=(keyed_element const& rhs) |
| { |
| base::operator=(rhs); |
| value_ = rhs.value_; |
| return *this; |
| } |
| |
| #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) |
| BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED |
| keyed_element& operator=(keyed_element&& rhs) |
| { |
| base::operator=(rhs.forward_base()); |
| value_ = std::move(rhs.value_); |
| return *this; |
| } |
| #endif |
| |
| Value value_; |
| }; |
| |
| template<typename Elem, typename Key> |
| struct keyed_element_value_at |
| : keyed_element_value_at<typename Elem::base, Key> |
| {}; |
| |
| template<typename Key, typename Value, typename Rest> |
| struct keyed_element_value_at<keyed_element<Key, Value, Rest>, Key> |
| { |
| typedef Value type; |
| }; |
| }}} |
| |
| #endif |