欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

set_view_base.hpp

Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
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 + -