| /*============================================================================= |
| Copyright (c) 2001-2006 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/type_traits/add_reference.hpp> |
| #include <boost/type_traits/add_const.hpp> |
| |
| #include <boost/fusion/iterator/deref.hpp> |
| #include <boost/fusion/iterator/next.hpp> |
| |
| namespace boost { namespace fusion { |
| |
| struct fusion_sequence_tag; |
| |
| namespace detail { |
| |
| struct nil_keyed_element |
| { |
| typedef fusion_sequence_tag tag; |
| void get(); |
| |
| template<typename It> |
| 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> |
| static keyed_element |
| from_iterator(It const& it) |
| { |
| return keyed_element( |
| *it, base::from_iterator(fusion::next(it))); |
| } |
| |
| template<typename U, typename Rst> |
| keyed_element(keyed_element<Key, U, Rst> const& rhs) |
| : Rest(rhs.get_base()), value_(rhs.value_) |
| {} |
| |
| Rest const get_base() const |
| { |
| return *this; |
| } |
| |
| typename add_reference<typename add_const<Value>::type>::type get(Key) const |
| { |
| return value_; |
| } |
| |
| typename add_reference<Value>::type get(Key) |
| { |
| return value_; |
| } |
| |
| keyed_element(typename add_reference<typename add_const<Value>::type>::type value, Rest const& rest) |
| : Rest(rest), value_(value) |
| {} |
| |
| keyed_element() |
| : Rest(), value_() |
| {} |
| |
| template<typename U, typename Rst> |
| 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; |
| } |
| |
| keyed_element& operator=(keyed_element const& rhs) |
| { |
| base::operator=(rhs); |
| value_ = rhs.value_; |
| return *this; |
| } |
| |
| 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 |