set_view_base.hpp
字号:
// Boost.Bimap//// Copyright (c) 2006-2007 Matias Capeletto//// 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)/// \file detail/set_view_base.hpp/// \brief Helper base for the construction of the bimap views types.#ifndef BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP#define BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP#if defined(_MSC_VER) && (_MSC_VER>=1200)#pragma once#endif#include <boost/config.hpp>#include <boost/bimap/relation/member_at.hpp>#include <boost/bimap/relation/support/data_extractor.hpp>#include <boost/bimap/detail/modifier_adaptor.hpp>#include <boost/bimap/detail/set_view_iterator.hpp>#include <boost/bimap/relation/support/get_pair_functor.hpp>#include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp>#include <boost/bimap/relation/mutant_relation.hpp>namespace boost {namespace bimaps {namespace detail {template< class Key, class Value, class KeyToBase >class set_view_key_to_base{ public: const Key operator()( const Value & v ) const { return keyToBase( v ); } private: KeyToBase keyToBase;};template< class MutantRelationStorage, class KeyToBase >class set_view_key_to_base<MutantRelationStorage,MutantRelationStorage,KeyToBase>{ typedef BOOST_DEDUCED_TYPENAME MutantRelationStorage::non_mutable_storage non_mutable_storage; public: const MutantRelationStorage & operator()( const non_mutable_storage & k ) const { return ::boost::bimaps::relation::detail::mutate<MutantRelationStorage>(k); } const MutantRelationStorage & operator()( const MutantRelationStorage & k ) const { return k; }};// The next macro can be converted in a metafunctor to gain code robustness./*===========================================================================*/#define BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( \ CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \) \::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \< \ CORE_INDEX, \ ::boost::bimaps::detail:: \ set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ ::boost::bimaps::detail:: \ const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ ::boost::bimaps::detail:: \ set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ ::boost::bimaps::detail:: \ const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ < \ ::boost::bimaps::detail:: set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ ::boost::bimaps::detail::const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ \ >, \ ::boost::mpl::na, \ ::boost::mpl::na, \ ::boost::bimaps::relation::detail:: \ get_mutable_relation_functor< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ ::boost::bimaps::relation::support:: \ get_above_view_functor< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ ::boost::bimaps::detail::set_view_key_to_base< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::key_type, \ BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type, \ BOOST_DEDUCED_TYPENAME CORE_INDEX::key_from_value \ > \>/*===========================================================================*//*===========================================================================*/#define BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( \ CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \) \::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \< \ CORE_INDEX, \ ::boost::bimaps::detail:: \ set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ ::boost::bimaps::detail:: \ const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ ::boost::bimaps::detail:: \ set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ ::boost::bimaps::detail:: \ const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ < \ ::boost::bimaps::detail:: set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ ::boost::bimaps::detail::const_set_view_iterator< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ \ >, \ ::boost::mpl::na, \ ::boost::mpl::na, \ ::boost::bimaps::relation::detail:: \ get_mutable_relation_functor< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ ::boost::bimaps::relation::support:: \ get_above_view_functor< \ BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type > \>/*===========================================================================*/#if defined(BOOST_MSVC)/*===========================================================================*/#define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ typedef ::boost::bimaps::detail::set_view_base< \ TYPE< INDEX_TYPE >, INDEX_TYPE > template_class_friend; \ friend class template_class_friend;/*===========================================================================*/#else/*===========================================================================*/#define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ friend class ::boost::bimaps::detail::set_view_base< \ TYPE< INDEX_TYPE >, INDEX_TYPE >;/*===========================================================================*/#endif/// \brief Common base for set views.template< class Derived, class Index >class set_view_base{ typedef ::boost::bimaps::container_adaptor::support:: iterator_facade_to_base < ::boost::bimaps::detail:: set_view_iterator<BOOST_DEDUCED_TYPENAME Index:: iterator>, ::boost::bimaps::detail:: const_set_view_iterator<BOOST_DEDUCED_TYPENAME Index::const_iterator> > iterator_to_base_; typedef BOOST_DEDUCED_TYPENAME Index::value_type::left_value_type left_type_; typedef BOOST_DEDUCED_TYPENAME Index::value_type::right_value_type right_type_; typedef BOOST_DEDUCED_TYPENAME Index::value_type value_type_; typedef ::boost::bimaps::detail:: set_view_iterator<BOOST_DEDUCED_TYPENAME Index::iterator> iterator_; public: bool replace(iterator_ position, const value_type_ & x) { return derived().base().replace( derived().template functor<iterator_to_base_>()(position),x ); } template< class CompatibleLeftType > bool replace_left(iterator_ position, const CompatibleLeftType & l) { return derived().base().replace( derived().template functor<iterator_to_base_>()(position), value_type_(l,position->right) ); } template< class CompatibleRightType > bool replace_right(iterator_ position, const CompatibleRightType & r) { return derived().base().replace( derived().template functor<iterator_to_base_>()(position), value_type_(position->left,r) ); } /* This function may be provided in the future template< class Modifier > bool modify(iterator_ position, Modifier mod) { return derived().base().modify( derived().template functor<iterator_to_base_>()(position), ::boost::bimaps::detail::relation_modifier_adaptor < Modifier, BOOST_DEDUCED_TYPENAME Index::value_type, BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: data_extractor < ::boost::bimaps::relation::member_at::left, BOOST_DEDUCED_TYPENAME Index::value_type >::type, BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: data_extractor < ::boost::bimaps::relation::member_at::right, BOOST_DEDUCED_TYPENAME Index::value_type >::type >(mod) ); } */ /* template< class Modifier > bool modify_left(iterator_ position, Modifier mod) { typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: data_extractor < BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, BOOST_DEDUCED_TYPENAME Index::value_type >::type left_data_extractor_; return derived().base().modify( derived().template functor<iterator_to_base_>()(position), // this may be replaced later by // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) ::boost::bimaps::detail::unary_modifier_adaptor < Modifier, BOOST_DEDUCED_TYPENAME Index::value_type, left_data_extractor_ >(mod) ); } template< class Modifier > bool modify_right(iterator_ position, Modifier mod) { typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: data_extractor < BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, BOOST_DEDUCED_TYPENAME Index::value_type >::type right_data_extractor_; return derived().base().modify( derived().template functor<iterator_to_base_>()(position), // this may be replaced later by // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) ::boost::bimaps::detail::unary_modifier_adaptor < Modifier, BOOST_DEDUCED_TYPENAME Index::value_type, right_data_extractor_ >(mod) ); } */ protected: typedef set_view_base set_view_base_; private: // Curiously Recurring Template interface. Derived& derived() { return *static_cast<Derived*>(this); } Derived const& derived() const { return *static_cast<Derived const*>(this); }};} // namespace detail} // namespace bimaps} // namespace boost#endif // BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -