123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*=============================================================================
- 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
|