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 views/vector_map_view.hpp Chris@16: /// \brief View of a side of a bimap. Chris@16: Chris@16: #ifndef BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP Chris@16: #define BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_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: Chris@16: namespace boost { Chris@16: namespace bimaps { Chris@16: namespace views { Chris@16: Chris@16: /// \brief View of a side of a bimap. Chris@16: /** Chris@16: Chris@16: This class uses container_adaptor and iterator_adaptor to wrapped a index of the Chris@16: multi_index bimap core. Chris@16: Chris@16: See also const_map_view. Chris@16: **/ Chris@16: template< class Tag, class BimapType > Chris@16: class vector_map_view Chris@16: : Chris@16: public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( Chris@16: vector_map_adaptor, Chris@16: Tag,BimapType, Chris@16: reverse_map_view_iterator, const_reverse_map_view_iterator Chris@16: ), Chris@16: Chris@16: public ::boost::bimaps::detail:: Chris@16: map_view_base< vector_map_view,Tag,BimapType > Chris@16: { Chris@16: typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( Chris@16: vector_map_adaptor, Chris@16: Tag,BimapType, Chris@16: reverse_map_view_iterator, const_reverse_map_view_iterator Chris@16: Chris@16: ) base_; Chris@16: Chris@16: BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(vector_map_view,Tag,BimapType) Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::data_extractor Chris@16: < Chris@16: Tag, Chris@16: BOOST_DEDUCED_TYPENAME BimapType::relation Chris@16: Chris@16: >::type key_from_base_value; Chris@16: Chris@16: public: Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; Chris@16: Chris@16: vector_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : Chris@16: base_(c) {} Chris@16: Chris@16: vector_map_view & operator=(const vector_map_view & v) Chris@16: { Chris@16: this->base() = v.base(); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::const_reference Chris@16: operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const Chris@16: { Chris@16: return this->template functor()( Chris@16: this->base().operator[](n) Chris@16: ); Chris@16: } Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::const_reference Chris@16: at(BOOST_DEDUCED_TYPENAME base_::size_type n) const Chris@16: { Chris@16: return this->template functor()( Chris@16: this->base().at(n) Chris@16: ); Chris@16: } Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference Chris@16: operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) Chris@16: { Chris@16: return this->template functor()( Chris@16: const_cast( Chris@16: this->base().operator[](n) Chris@16: )); Chris@16: } Chris@16: Chris@16: BOOST_DEDUCED_TYPENAME base_::reference Chris@16: at(BOOST_DEDUCED_TYPENAME base_::size_type n) Chris@16: { Chris@16: return this->template functor()( Chris@16: const_cast( Chris@16: this->base().at(n) Chris@16: )); Chris@16: } Chris@16: Chris@16: BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) Chris@16: Chris@16: BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) Chris@16: Chris@16: // Lists operations Chris@16: Chris@16: void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, vector_map_view & x) Chris@16: { Chris@16: this->base().splice( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), Chris@16: x.base() Chris@16: ); Chris@16: } Chris@16: Chris@16: void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, Chris@16: vector_map_view & x, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator i) Chris@16: { Chris@16: this->base().splice( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), Chris@16: x.base(), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) Chris@16: ); Chris@16: } Chris@16: Chris@16: void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, Chris@16: vector_map_view & x, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator first, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator last) Chris@16: { Chris@16: this->base().splice( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), Chris@16: x.base(), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) Chris@16: ); Chris@16: } Chris@16: Chris@16: void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits< Chris@16: BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value) Chris@16: { Chris@16: this->base().remove( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class Predicate > Chris@16: void remove_if(Predicate pred) Chris@16: { Chris@16: this->base().remove_if( Chris@16: ::boost::bimaps::container_adaptor::detail::unary_check_adaptor Chris@16: < Chris@16: Predicate, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( pred, key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: void unique() Chris@16: { Chris@16: this->base().unique( Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: std::equal_to, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >(std::equal_to(), Chris@16: key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class BinaryPredicate > Chris@16: void unique(BinaryPredicate binary_pred) Chris@16: { Chris@16: this->base().unique( Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: BinaryPredicate, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( binary_pred, key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: void merge(vector_map_view & x) Chris@16: { Chris@16: this->base().merge(x.base(), Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: std::less, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( std::less(), Chris@16: key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class Compare > Chris@16: void merge(vector_map_view & x, Compare comp) Chris@16: { Chris@16: this->base().merge(x.base(), Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: Compare, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( comp, key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: void sort() Chris@16: { Chris@16: this->base().sort( Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: std::less, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( std::less(), Chris@16: key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: template< class Compare > Chris@16: void sort(Compare comp) Chris@16: { Chris@16: this->base().sort( Chris@16: ::boost::bimaps::container_adaptor::detail::comparison_adaptor Chris@16: < Chris@16: Compare, Chris@16: BOOST_DEDUCED_TYPENAME base_::base_type::value_type, Chris@16: key_from_base_value Chris@16: Chris@16: >( comp, key_from_base_value() ) Chris@16: ); Chris@16: } Chris@16: Chris@16: void reverse() Chris@16: { Chris@16: this->base().reverse(); Chris@16: } Chris@16: Chris@16: // Rearrange Operations Chris@16: Chris@16: void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator i) Chris@16: { Chris@16: this->base().relocate( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) Chris@16: ); Chris@16: } Chris@16: Chris@16: void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator first, Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator last) Chris@16: { Chris@16: this->base().relocate( Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), Chris@16: this->template functor< Chris@16: BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) Chris@16: ); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace views Chris@16: Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ Chris@16: typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ Chris@16: BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); Chris@16: /*===========================================================================*/ Chris@16: Chris@16: /*===========================================================================*/ Chris@16: #define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ Chris@16: BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \ Chris@16: BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator) Chris@16: /*===========================================================================*/ Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template< class Tag, class BimapType > Chris@16: struct left_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view > Chris@16: { Chris@16: private: typedef ::boost::bimaps::views::vector_map_view map_view_; Chris@16: public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) Chris@16: }; Chris@16: Chris@16: template< class Tag, class BimapType > Chris@16: struct right_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view > Chris@16: { Chris@16: private: typedef ::boost::bimaps::views::vector_map_view map_view_; Chris@16: public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /*===========================================================================*/ Chris@16: #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF Chris@16: #undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY Chris@16: /*===========================================================================*/ Chris@16: Chris@16: } // namespace bimaps Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP Chris@16: