Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2013 Joel de Guzman 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_MAP_IMPL_02032013_2233) Chris@16: #define BOOST_FUSION_MAP_IMPL_02032013_2233 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #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 map_impl_from_iterator {}; Chris@16: Chris@16: template Chris@16: struct map_impl; Chris@16: Chris@16: template Chris@16: struct map_impl Chris@16: { Chris@16: typedef fusion_sequence_tag tag; Chris@16: static int const index = index_; Chris@16: static int const size = 0; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: map_impl() BOOST_NOEXCEPT {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: map_impl(Iterator const&, map_impl_from_iterator) BOOST_NOEXCEPT Chris@16: {} Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: void assign(Iterator const&, map_impl_from_iterator) BOOST_NOEXCEPT Chris@16: {} Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: void get(); Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: void get_val(); Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: void get_key(); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct map_impl : map_impl Chris@16: { Chris@16: typedef fusion_sequence_tag tag; Chris@16: typedef map_impl rest_type; Chris@16: Chris@16: using rest_type::get; Chris@16: using rest_type::get_val; Chris@16: using rest_type::get_key; Chris@16: Chris@16: static int const index = index_; Chris@16: static int const size = rest_type::size + 1; Chris@16: Chris@16: typedef Pair pair_type; Chris@16: typedef typename Pair::first_type key_type; Chris@16: typedef typename Pair::second_type value_type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl() Chris@16: : rest_type(), element() Chris@16: {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl(map_impl const& rhs) Chris@16: : rest_type(rhs.get_base()), element(rhs.element) Chris@16: {} Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl(map_impl&& rhs) Chris@101: : rest_type(BOOST_FUSION_FWD_ELEM(rest_type, *static_cast(&rhs))) Chris@101: , element(BOOST_FUSION_FWD_ELEM(Pair, rhs.element)) Chris@16: {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl(map_impl const& rhs) Chris@16: : rest_type(rhs.get_base()), element(rhs.element) Chris@16: {} Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: map_impl(typename detail::call_param::type element_ Chris@16: , typename detail::call_param::type... rest) Chris@101: : rest_type(rest...), element(element_) Chris@16: {} Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: map_impl(Pair&& element_, T&&... rest) Chris@101: : rest_type(BOOST_FUSION_FWD_ELEM(T, rest)...) Chris@101: , element(BOOST_FUSION_FWD_ELEM(Pair, element_)) Chris@16: {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl(Iterator const& iter, map_impl_from_iterator fi) Chris@16: : rest_type(fusion::next(iter), fi) Chris@16: , element(*iter) Chris@16: {} Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: rest_type& get_base() Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: rest_type const& get_base() const Chris@16: { Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: value_type get_val(mpl::identity); Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: pair_type get_val(mpl::int_); Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: value_type get_val(mpl::identity) const; Chris@101: BOOST_FUSION_GPU_ENABLED Chris@16: pair_type get_val(mpl::int_) const; Chris@16: Chris@101: BOOST_FUSION_GPU_ENABLED Chris@101: mpl::identity get_key(mpl::int_); Chris@101: BOOST_FUSION_GPU_ENABLED Chris@101: mpl::identity get_key(mpl::int_) const; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename cref_result::type Chris@16: get(mpl::identity) const Chris@16: { Chris@16: return element.second; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename ref_result::type Chris@16: get(mpl::identity) Chris@16: { Chris@16: return element.second; Chris@16: } Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename cref_result::type Chris@16: get(mpl::int_) const Chris@16: { Chris@16: return element; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: typename ref_result::type Chris@16: get(mpl::int_) Chris@16: { Chris@16: return element; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl& operator=(map_impl const& rhs) Chris@16: { Chris@16: rest_type::operator=(rhs); Chris@16: element = rhs.element; Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl& operator=(map_impl const& rhs) Chris@16: { Chris@16: rest_type::operator=(rhs); Chris@16: element = rhs.element; Chris@16: return *this; Chris@16: } Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: map_impl& operator=(map_impl&& rhs) Chris@16: { Chris@16: rest_type::operator=(std::forward(rhs)); Chris@101: element = BOOST_FUSION_FWD_ELEM(Pair, rhs.element); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: void assign(Iterator const& iter, map_impl_from_iterator fi) Chris@16: { Chris@16: rest_type::assign(fusion::next(iter), fi); Chris@16: element = *iter; Chris@16: } Chris@16: Chris@16: Pair element; Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #endif