Boost C++ Libraries Boost.Bimap Home Libraries People FAQ More

PrevUpHomeNext

list_map_adaptor.hpp

Go to the documentation of this file.
00001  // Boost.Bimap
00002 //
00003 // Copyright (c) 2006-2007 Matias Capeletto
00004 //
00005 // Distributed under the Boost Software License, Version 1.0.
00006 // (See accompanying file LICENSE_1_0.txt or copy at
00007 // http://www.boost.org/LICENSE_1_0.txt)
00008 
00009 /// \file container_adaptor/list_map_adaptor.hpp
00010 /// \brief Container adaptor.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
00014 
00015 #if defined(_MSC_VER) && (_MSC_VER>=1200)
00016 #pragma once
00017 #endif
00018 
00019 #include <boost/config.hpp>
00020 
00021 #include <boost/mpl/list.hpp>
00022 #include <boost/mpl/push_front.hpp>
00023 
00024 #include <boost/bimap/container_adaptor/list_adaptor.hpp>
00025 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
00026 #include <boost/bimap/container_adaptor/detail/key_extractor.hpp>
00027 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
00028 #include <boost/mpl/vector.hpp>
00029 #include <boost/mpl/aux_/na.hpp>
00030 #include <boost/mpl/if.hpp>
00031 
00032 namespace boost {
00033 namespace bimaps {
00034 namespace container_adaptor {
00035 
00036 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
00037 
00038 template
00039 <
00040     class Base, class Iterator, class ConstIterator,
00041     class ReverseIterator, class ConstReverseIterator,
00042     class IteratorToBaseConverter, class IteratorFromBaseConverter,
00043     class ReverseIteratorFromBaseConverter,
00044     class ValueToBaseConverter, class ValueFromBaseConverter,
00045     class KeyFromBaseValueConverter,
00046     class FunctorsFromDerivedClasses
00047 >
00048 struct list_map_adaptor_base
00049 {
00050     typedef list_adaptor
00051     <
00052         Base,
00053 
00054         Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
00055 
00056         IteratorToBaseConverter, IteratorFromBaseConverter,
00057 
00058         ReverseIteratorFromBaseConverter,
00059 
00060         ValueToBaseConverter, ValueFromBaseConverter,
00061 
00062         BOOST_DEDUCED_TYPENAME mpl::push_front<
00063 
00064             FunctorsFromDerivedClasses,
00065 
00066             BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
00067             // {
00068                     detail::key_from_pair_extractor
00069                     <
00070                         BOOST_DEDUCED_TYPENAME Iterator::value_type 
00071                     >,
00072             // }
00073             // else
00074             // {
00075                     KeyFromBaseValueConverter
00076             // }
00077 
00078             >::type
00079 
00080         >::type
00081 
00082     > type;
00083 };
00084 
00085 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
00086 
00087 /// \brief Container adaptor to easily build a list map container
00088 
00089 template
00090 <
00091     class Base,
00092 
00093     class Iterator,
00094     class ConstIterator,
00095     class ReverseIterator,
00096     class ConstReverseIterator,
00097 
00098     class IteratorToBaseConverter          = ::boost::mpl::na,
00099     class IteratorFromBaseConverter        = ::boost::mpl::na,
00100     class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
00101     class ValueToBaseConverter             = ::boost::mpl::na,
00102     class ValueFromBaseConverter           = ::boost::mpl::na,
00103     class KeyFromBaseValueConverter        = ::boost::mpl::na,
00104 
00105     class FunctorsFromDerivedClasses = mpl::vector<>
00106 >
00107 class list_map_adaptor :
00108 
00109     public list_map_adaptor_base
00110     <
00111         Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
00112         IteratorToBaseConverter, IteratorFromBaseConverter,
00113         ReverseIteratorFromBaseConverter,
00114         ValueToBaseConverter, ValueFromBaseConverter,
00115         KeyFromBaseValueConverter,
00116         FunctorsFromDerivedClasses
00117 
00118     >::type
00119 {
00120     typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base
00121     <
00122         Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
00123         IteratorToBaseConverter, IteratorFromBaseConverter,
00124         ReverseIteratorFromBaseConverter,
00125         ValueToBaseConverter, ValueFromBaseConverter,
00126         KeyFromBaseValueConverter,
00127         FunctorsFromDerivedClasses
00128 
00129     >::type base_;
00130 
00131     // MetaData -------------------------------------------------------------
00132 
00133     public:
00134 
00135     typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type  key_type;
00136     typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
00137 
00138     protected:
00139 
00140     typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
00141     // {
00142             detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >,
00143     // }
00144     // else
00145     // {
00146             KeyFromBaseValueConverter
00147     // }
00148 
00149     >::type key_from_base_value;
00150 
00151     // Access -----------------------------------------------------------------
00152 
00153     public:
00154 
00155     explicit list_map_adaptor(Base & c) :
00156         base_(c) {}
00157 
00158     protected:
00159 
00160     typedef list_map_adaptor list_map_adaptor_;
00161 
00162     // Functions -------------------------------------------------------------
00163 
00164     public:
00165 
00166     // The following functions are overwritten in order to work 
00167     // with key_type instead of value_type
00168 
00169     template< class Predicate >
00170     void remove_if(Predicate pred)
00171     {
00172         this->base().remove_if(
00173             ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
00174             <
00175                 Predicate,
00176                 BOOST_DEDUCED_TYPENAME Base::value_type,
00177                 key_from_base_value
00178 
00179             >( pred, this->template functor<key_from_base_value>() )
00180         );
00181     }
00182 
00183     void unique()
00184     {
00185         this->base().unique(
00186             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00187             <
00188                 std::equal_to<key_type>,
00189                 BOOST_DEDUCED_TYPENAME Base::value_type,
00190                 key_from_base_value
00191 
00192             >(
00193                 std::equal_to<key_type>(),
00194                 this->template functor<key_from_base_value>()
00195             )
00196         );
00197     }
00198 
00199     template< class BinaryPredicate >
00200     void unique(BinaryPredicate binary_pred)
00201     {
00202         this->base().unique(
00203             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00204             <
00205                 BinaryPredicate,
00206                 BOOST_DEDUCED_TYPENAME Base::value_type,
00207                 key_from_base_value
00208 
00209             >( binary_pred, this->template functor<key_from_base_value>() )
00210         );
00211     }
00212 
00213     void merge(list_map_adaptor & x)
00214     {
00215         this->base().merge(x.base(),
00216             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00217             <
00218                 std::less<key_type>,
00219                 BOOST_DEDUCED_TYPENAME Base::value_type,
00220                 key_from_base_value
00221 
00222             >(
00223                 std::less<key_type>(),
00224                 this->template functor<key_from_base_value>()
00225             )
00226         );
00227     }
00228 
00229     template< class Compare >
00230     void merge(list_map_adaptor & x, Compare comp)
00231     {
00232         this->base().merge(x.base(),
00233             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00234             <
00235                 Compare,
00236                 BOOST_DEDUCED_TYPENAME Base::value_type,
00237                 key_from_base_value
00238 
00239             >( comp, this->template functor<key_from_base_value>() )
00240         );
00241     }
00242 
00243     void sort()
00244     {
00245         this->base().sort(
00246             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00247             <
00248                 std::less<key_type>,
00249                 BOOST_DEDUCED_TYPENAME Base::value_type,
00250                 key_from_base_value
00251 
00252             >(
00253                 std::less<key_type>(),
00254                 this->template functor<key_from_base_value>()
00255             )
00256         );
00257     }
00258 
00259     template< class Compare >
00260     void sort(Compare comp)
00261     {
00262         this->base().sort(
00263             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00264             <
00265                 Compare,
00266                 BOOST_DEDUCED_TYPENAME Base::value_type,
00267                 key_from_base_value
00268 
00269             >( comp, this->template functor<key_from_base_value>() )
00270         );
00271     }
00272 
00273 };
00274 
00275 
00276 } // namespace container_adaptor
00277 } // namespace bimaps
00278 } // namespace boost
00279 
00280 
00281 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
00282 
Copyright 2006 Matias Capeletto

PrevUpHomeNext