Chris@16: // Boost.Bimap Chris@16: // Chris@16: // Copyright (c) 2006-2007 Matias Capeletto Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: /// \file detail/set_view_base.hpp Chris@16: /// \brief Helper base for the construction of the bimap views types. Chris@16: Chris@16: #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP Chris@16: #define BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace bimaps { Chris@16: namespace detail { Chris@16: Chris@16: template< class Key, class Value, class KeyToBase > Chris@16: class set_view_key_to_base Chris@16: { Chris@16: public: Chris@16: const Key operator()( const Value & v ) const Chris@16: { Chris@16: return keyToBase( v ); Chris@16: } Chris@16: private: Chris@16: KeyToBase keyToBase; Chris@16: }; Chris@16: Chris@16: template< class MutantRelationStorage, class KeyToBase > Chris@16: class set_view_key_to_base Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME MutantRelationStorage::non_mutable_storage non_mutable_storage; Chris@16: public: Chris@16: const MutantRelationStorage & operator()( const non_mutable_storage & k ) const Chris@16: { Chris@16: return ::boost::bimaps::relation::detail::mutate(k); Chris@16: } Chris@16: const MutantRelationStorage & operator()( const MutantRelationStorage & k ) const Chris@16: { Chris@16: return k; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: // The next macro can be converted in a metafunctor to gain code robustness. Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( \ Chris@16: CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \ Chris@16: ) \ Chris@16: ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \ Chris@16: < \ Chris@16: CORE_INDEX, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ Chris@16: ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ Chris@16: < \ Chris@16: ::boost::bimaps::detail:: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ Chris@16: ::boost::bimaps::detail::const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ Chris@16: \ Chris@16: >, \ Chris@16: ::boost::mpl::na, \ Chris@16: ::boost::mpl::na, \ Chris@16: ::boost::bimaps::relation::detail:: \ Chris@16: get_mutable_relation_functor< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ Chris@16: ::boost::bimaps::relation::support:: \ Chris@16: get_above_view_functor< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ Chris@16: ::boost::bimaps::detail::set_view_key_to_base< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::key_type, \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type, \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::key_from_value \ Chris@16: > \ Chris@16: > Chris@16: /*===========================================================================*/ Chris@16: Chris@16: Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( \ Chris@16: CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \ Chris@16: ) \ Chris@16: ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \ Chris@16: < \ Chris@16: CORE_INDEX, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ Chris@16: ::boost::bimaps::detail:: \ Chris@16: const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ Chris@16: ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ Chris@16: < \ Chris@16: ::boost::bimaps::detail:: set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ Chris@16: ::boost::bimaps::detail::const_set_view_iterator< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ Chris@16: \ Chris@16: >, \ Chris@16: ::boost::mpl::na, \ Chris@16: ::boost::mpl::na, \ Chris@16: ::boost::bimaps::relation::detail:: \ Chris@16: get_mutable_relation_functor< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ Chris@16: ::boost::bimaps::relation::support:: \ Chris@16: get_above_view_functor< \ Chris@16: BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type > \ Chris@16: > Chris@16: /*===========================================================================*/ Chris@16: Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ Chris@16: typedef ::boost::bimaps::detail::set_view_base< \ Chris@16: TYPE< INDEX_TYPE >, INDEX_TYPE > template_class_friend; \ Chris@16: friend class template_class_friend; Chris@16: /*===========================================================================*/ Chris@16: #else Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ Chris@16: friend class ::boost::bimaps::detail::set_view_base< \ Chris@16: TYPE< INDEX_TYPE >, INDEX_TYPE >; Chris@16: /*===========================================================================*/ Chris@16: #endif Chris@16: Chris@16: Chris@16: /// \brief Common base for set views. Chris@16: Chris@16: template< class Derived, class Index > Chris@16: class set_view_base Chris@16: { Chris@16: typedef ::boost::bimaps::container_adaptor::support:: Chris@16: iterator_facade_to_base Chris@16: < Chris@16: ::boost::bimaps::detail:: Chris@16: set_view_iterator, Chris@16: ::boost::bimaps::detail:: Chris@16: const_set_view_iterator Chris@16: Chris@16: > iterator_to_base_; Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME Index::value_type::left_value_type left_type_; Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME Index::value_type::right_value_type right_type_; Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME Index::value_type value_type_; Chris@16: Chris@16: typedef ::boost::bimaps::detail:: Chris@16: set_view_iterator iterator_; Chris@16: Chris@16: public: Chris@16: Chris@16: bool replace(iterator_ position, Chris@16: const value_type_ & x) Chris@16: { Chris@16: return derived().base().replace( Chris@16: derived().template functor()(position),x Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class CompatibleLeftType > Chris@16: bool replace_left(iterator_ position, Chris@16: const CompatibleLeftType & l) Chris@16: { Chris@16: return derived().base().replace( Chris@16: derived().template functor()(position), Chris@16: ::boost::bimaps::relation::detail::copy_with_left_replaced(*position,l) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class CompatibleRightType > Chris@16: bool replace_right(iterator_ position, Chris@16: const CompatibleRightType & r) Chris@16: { Chris@16: return derived().base().replace( Chris@16: derived().template functor()(position), Chris@16: ::boost::bimaps::relation::detail::copy_with_right_replaced(*position,r) Chris@16: ); Chris@16: } Chris@16: Chris@16: /* This function may be provided in the future Chris@16: Chris@16: template< class Modifier > Chris@16: bool modify(iterator_ position, Chris@16: Modifier mod) Chris@16: { Chris@16: return derived().base().modify( Chris@16: Chris@16: derived().template functor()(position), Chris@16: Chris@16: ::boost::bimaps::detail::relation_modifier_adaptor Chris@16: < Chris@16: Modifier, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type, Chris@16: BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: Chris@16: data_extractor Chris@16: < Chris@16: ::boost::bimaps::relation::member_at::left, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type Chris@16: Chris@16: >::type, Chris@16: BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: Chris@16: data_extractor Chris@16: < Chris@16: ::boost::bimaps::relation::member_at::right, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type Chris@16: Chris@16: >::type Chris@16: Chris@16: >(mod) Chris@16: ); Chris@16: } Chris@16: */ Chris@16: /* Chris@16: template< class Modifier > Chris@16: bool modify_left(iterator_ position, Modifier mod) Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: Chris@16: data_extractor Chris@16: < Chris@16: BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type Chris@16: Chris@16: >::type left_data_extractor_; Chris@16: Chris@16: return derived().base().modify( Chris@16: Chris@16: derived().template functor()(position), Chris@16: Chris@16: // this may be replaced later by Chris@16: // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) Chris@16: Chris@16: ::boost::bimaps::detail::unary_modifier_adaptor Chris@16: < Chris@16: Modifier, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type, Chris@16: left_data_extractor_ Chris@16: Chris@16: >(mod) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class Modifier > Chris@16: bool modify_right(iterator_ position, Modifier mod) Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: Chris@16: data_extractor Chris@16: < Chris@16: BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type Chris@16: Chris@16: >::type right_data_extractor_; Chris@16: Chris@16: return derived().base().modify( Chris@16: Chris@16: derived().template functor()(position), Chris@16: Chris@16: // this may be replaced later by Chris@16: // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) Chris@16: Chris@16: ::boost::bimaps::detail::unary_modifier_adaptor Chris@16: < Chris@16: Modifier, Chris@16: BOOST_DEDUCED_TYPENAME Index::value_type, Chris@16: right_data_extractor_ Chris@16: Chris@16: >(mod) Chris@16: ); Chris@16: } Chris@16: */ Chris@16: protected: Chris@16: Chris@16: typedef set_view_base set_view_base_; Chris@16: Chris@16: private: Chris@16: Chris@16: // Curiously Recurring Template interface. Chris@16: Chris@16: Derived& derived() Chris@16: { Chris@16: return *static_cast(this); Chris@16: } Chris@16: Chris@16: Derived const& derived() const Chris@16: { Chris@16: return *static_cast(this); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace bimaps Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP