Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2012 Joel de Guzman Chris@16: Copyright (c) 2005-2006 Dan Marsden Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330) Chris@16: #define BOOST_FUSION_DEQUE_DETAIL_KEYED_ELEMENT_26112006_1330 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: struct fusion_sequence_tag; Chris@16: }} Chris@16: Chris@16: namespace boost { namespace fusion { namespace detail Chris@16: { Chris@16: struct nil_keyed_element Chris@16: { Chris@16: typedef fusion_sequence_tag tag; Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: void get(); Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static nil_keyed_element Chris@16: from_iterator(It const&) Chris@16: { Chris@16: return nil_keyed_element(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct keyed_element : Rest Chris@16: { Chris@16: typedef Rest base; Chris@16: typedef fusion_sequence_tag tag; Chris@16: using Rest::get; Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static keyed_element Chris@16: from_iterator(It const& it) Chris@16: { Chris@16: return keyed_element( Chris@16: *it, base::from_iterator(fusion::next(it))); Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element(keyed_element const& rhs) Chris@16: : Rest(rhs.get_base()), value_(rhs.value_) Chris@16: {} Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element(keyed_element&& rhs) Chris@101: : Rest(BOOST_FUSION_FWD_ELEM(Rest, rhs.forward_base())) Chris@101: , value_(BOOST_FUSION_FWD_ELEM(Value, rhs.value_)) Chris@16: {} Chris@16: #endif Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: keyed_element(keyed_element const& rhs Chris@101: , typename enable_if >::type* = 0) Chris@16: : Rest(rhs.get_base()), value_(rhs.value_) Chris@16: {} Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: #endif Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: Rest& get_base() BOOST_NOEXCEPT Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: Rest const& get_base() const BOOST_NOEXCEPT Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: Rest&& forward_base() BOOST_NOEXCEPT Chris@16: { Chris@101: return BOOST_FUSION_FWD_ELEM(Rest, *static_cast(this)); Chris@16: } Chris@16: #endif Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename cref_result::type get(Key) const Chris@16: { Chris@16: return value_; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename ref_result::type get(Key) Chris@16: { Chris@16: return value_; Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element( Chris@16: typename detail::call_param::type value Chris@16: , Rest const& rest) Chris@16: : Rest(rest), value_(value) Chris@16: {} Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element(Value&& value, Rest&& rest) Chris@101: : Rest(BOOST_FUSION_FWD_ELEM(Rest, rest)) Chris@101: , value_(BOOST_FUSION_FWD_ELEM(Value, value)) Chris@16: {} Chris@16: #endif Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element() Chris@16: : Rest(), value_() Chris@16: {} Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element& operator=(keyed_element const& rhs) Chris@16: { Chris@16: base::operator=(static_cast(rhs)); // cast for msvc-7.1 Chris@16: value_ = rhs.value_; Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element& operator=(keyed_element const& rhs) Chris@16: { Chris@16: base::operator=(rhs); Chris@16: value_ = rhs.value_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: keyed_element& operator=(keyed_element&& rhs) Chris@16: { Chris@16: base::operator=(std::forward(rhs)); Chris@101: value_ = BOOST_FUSION_FWD_ELEM(Value, rhs.value_); Chris@16: return *this; Chris@16: } Chris@16: #endif Chris@16: Chris@16: Value value_; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct keyed_element_value_at Chris@16: : keyed_element_value_at Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct keyed_element_value_at, Key> Chris@16: { Chris@16: typedef Value type; Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #endif