172 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     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> | ||
|  | 
 | ||
|  | 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) | ||
|  |         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 |