/*============================================================================= 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 #include #include namespace boost { namespace fusion { struct fusion_sequence_tag; }} namespace boost { namespace fusion { namespace detail { struct nil_keyed_element { typedef fusion_sequence_tag tag; void get(); template static nil_keyed_element from_iterator(It const&) { return nil_keyed_element(); } }; template struct keyed_element : Rest { typedef Rest base; typedef fusion_sequence_tag tag; using Rest::get; template static keyed_element from_iterator(It const& it) { return keyed_element( *it, base::from_iterator(fusion::next(it))); } keyed_element(keyed_element const& rhs) : Rest(rhs.get_base()), value_(rhs.value_) {} #if !defined(BOOST_NO_RVALUE_REFERENCES) keyed_element(keyed_element&& rhs) : Rest(std::forward(rhs.forward_base())) , value_(std::forward(rhs.value_)) {} #endif template keyed_element(keyed_element const& rhs) : Rest(rhs.get_base()), value_(rhs.value_) {} Rest& get_base() { return *this; } Rest const& get_base() const { return *this; } #if !defined(BOOST_NO_RVALUE_REFERENCES) Rest&& forward_base() { return std::forward(*static_cast(this)); } #endif typename cref_result::type get(Key) const { return value_; } typename ref_result::type get(Key) { return value_; } keyed_element(Value const& value, Rest const& rest) : Rest(rest), value_(value) {} #if !defined(BOOST_NO_RVALUE_REFERENCES) keyed_element(Value&& value, Rest&& rest) : Rest(std::forward(rest)) , value_(std::forward(value)) {} #endif keyed_element() : Rest(), value_() {} template keyed_element& operator=(keyed_element const& rhs) { base::operator=(static_cast(rhs)); // cast for msvc-7.1 value_ = rhs.value_; return *this; } keyed_element& operator=(keyed_element const& rhs) { base::operator=(rhs); value_ = rhs.value_; return *this; } Value value_; }; template struct keyed_element_value_at : keyed_element_value_at {}; template struct keyed_element_value_at, Key> { typedef Value type; }; }}} #endif