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

PrevUpHomeNext

associative_container_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/associative_container_adaptor.hpp
00010 /// \brief Container adaptor to build a type that is compliant to the concept of an associative container.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_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 <utility>
00022 
00023 #include <boost/mpl/vector.hpp>
00024 #include <boost/mpl/if.hpp>
00025 #include <boost/mpl/aux_/na.hpp>
00026 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
00027 #include <boost/bimap/container_adaptor/container_adaptor.hpp>
00028 #include <boost/call_traits.hpp>
00029 
00030 namespace boost {
00031 namespace bimaps {
00032 namespace container_adaptor {
00033 
00034 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
00035 
00036 template
00037 <
00038     class Base, class Iterator, class ConstIterator, class KeyType,
00039     class IteratorToBaseConverter, class IteratorFromBaseConverter,
00040     class ValueToBaseConverter, class ValueFromBaseConverter, class KeyToBaseConverter,
00041     class FunctorsFromDerivedClasses
00042 >
00043 struct associative_container_adaptor_base
00044 {
00045     typedef container_adaptor
00046     <
00047         Base,
00048 
00049         Iterator, ConstIterator,
00050 
00051         IteratorToBaseConverter, IteratorFromBaseConverter,
00052         ValueToBaseConverter   , ValueFromBaseConverter,
00053 
00054         BOOST_DEDUCED_TYPENAME mpl::push_front<
00055 
00056             FunctorsFromDerivedClasses,
00057 
00058             BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyToBaseConverter>,
00059             // {
00060                     detail::key_to_base_identity
00061                     <
00062                         BOOST_DEDUCED_TYPENAME Base::key_type, KeyType
00063                     >,
00064             // }
00065             // else
00066             // {
00067                     KeyToBaseConverter
00068             // }
00069 
00070             >::type
00071 
00072         >::type
00073 
00074     > type;
00075 };
00076 
00077 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
00078 
00079 
00080 /// \brief Container adaptor to build a type that is compliant to the concept of an associative container.
00081 
00082 template
00083 <
00084     class Base,
00085 
00086     class Iterator,
00087     class ConstIterator,
00088 
00089     class KeyType,
00090 
00091     class IteratorToBaseConverter   = ::boost::mpl::na,
00092     class IteratorFromBaseConverter = ::boost::mpl::na,
00093     class ValueToBaseConverter      = ::boost::mpl::na,
00094     class ValueFromBaseConverter    = ::boost::mpl::na,
00095     class KeyToBaseConverter        = ::boost::mpl::na,
00096 
00097     class FunctorsFromDerivedClasses = mpl::vector<>
00098 >
00099 class associative_container_adaptor :
00100 
00101     public associative_container_adaptor_base
00102     <
00103         Base, Iterator, ConstIterator, KeyType,
00104         IteratorToBaseConverter, IteratorFromBaseConverter,
00105         ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
00106         FunctorsFromDerivedClasses
00107 
00108     >::type
00109 {
00110 
00111     // MetaData -------------------------------------------------------------
00112 
00113     typedef typename associative_container_adaptor_base
00114     <
00115         Base, Iterator, ConstIterator, KeyType,
00116         IteratorToBaseConverter, IteratorFromBaseConverter,
00117         ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
00118         FunctorsFromDerivedClasses
00119 
00120     >::type base_;
00121 
00122     public:
00123 
00124     typedef KeyType key_type;
00125 
00126     protected:
00127 
00128     typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyToBaseConverter>,
00129     // {
00130             detail::key_to_base_identity
00131             <
00132                 BOOST_DEDUCED_TYPENAME Base::key_type, KeyType
00133             >,
00134     // }
00135     // else
00136     // {
00137             KeyToBaseConverter
00138     // }
00139 
00140     >::type key_to_base;
00141 
00142     public:
00143 
00144     explicit associative_container_adaptor(Base & c)
00145         : base_(c) {}
00146 
00147     protected:
00148 
00149 
00150     typedef associative_container_adaptor associative_container_adaptor_;
00151 
00152     // Interface --------------------------------------------------------------
00153 
00154     public:
00155 
00156     template< class CompatibleKey >
00157     BOOST_DEDUCED_TYPENAME base_::size_type erase(const CompatibleKey & k)
00158     {
00159         return this->base().erase
00160         (
00161             this->template functor<key_to_base>()(k)
00162         );
00163     }
00164 
00165     // As we redefine erase, the other overloads need to be manually routed
00166 
00167     BOOST_DEDUCED_TYPENAME base_::iterator erase(
00168         BOOST_DEDUCED_TYPENAME base_::iterator pos)
00169     {
00170         return base_::container_adaptor_::erase(pos);
00171     }
00172 
00173     BOOST_DEDUCED_TYPENAME base_::iterator erase(
00174         BOOST_DEDUCED_TYPENAME base_::iterator first,
00175         BOOST_DEDUCED_TYPENAME base_::iterator last)
00176     {
00177         return base_::container_adaptor_::erase(first,last);
00178     }
00179 
00180     template< class CompatibleKey >
00181     BOOST_DEDUCED_TYPENAME base_::size_type count(const CompatibleKey & k)
00182     {
00183         return this->base().count(
00184             this->template functor<key_to_base>()(k)
00185         );
00186     }
00187 
00188     template< class CompatibleKey >
00189     BOOST_DEDUCED_TYPENAME base_::iterator find(const CompatibleKey & k)
00190     {
00191         return this->template functor<typename base_::iterator_from_base>()
00192         (
00193             this->base().find(
00194                 this->template functor<key_to_base>()(k)
00195             )
00196         );
00197     }
00198 
00199     template< class CompatibleKey >
00200     BOOST_DEDUCED_TYPENAME base_::const_iterator
00201         find(const CompatibleKey & k) const
00202     {
00203         return this->template functor<
00204             BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()
00205         (
00206             this->base().find(
00207                 this->template functor<key_to_base>()(k)
00208             )
00209         );
00210     }
00211 
00212     template< class CompatibleKey >
00213     std::pair
00214     <
00215         BOOST_DEDUCED_TYPENAME base_::iterator,
00216         BOOST_DEDUCED_TYPENAME base_::iterator
00217     >
00218         equal_range(const CompatibleKey & k)
00219     {
00220         //TODO check this
00221 
00222         std::pair<
00223 
00224             BOOST_DEDUCED_TYPENAME Base::iterator,
00225             BOOST_DEDUCED_TYPENAME Base::iterator
00226 
00227         > r( this->base().equal_range(
00228                 this->template functor<key_to_base>()(k)
00229             )
00230         );
00231 
00232         return std::pair
00233         <
00234             BOOST_DEDUCED_TYPENAME base_::iterator,
00235             BOOST_DEDUCED_TYPENAME base_::iterator
00236         >(
00237             this->template functor<
00238                 BOOST_DEDUCED_TYPENAME base_::iterator_from_base
00239             >()                                         ( r.first ),
00240             this->template functor<
00241                 BOOST_DEDUCED_TYPENAME base_::iterator_from_base
00242             >()                                         ( r.second )
00243         );
00244     }
00245 
00246     template< class CompatibleKey >
00247     std::pair
00248     <
00249         BOOST_DEDUCED_TYPENAME base_::const_iterator,
00250         BOOST_DEDUCED_TYPENAME base_::const_iterator
00251     >
00252         equal_range(const CompatibleKey & k) const
00253     {
00254         std::pair<
00255 
00256             BOOST_DEDUCED_TYPENAME Base::const_iterator,
00257             BOOST_DEDUCED_TYPENAME Base::const_iterator
00258 
00259         > r( this->base().equal_range(
00260                 this->template functor<key_to_base>()(k)
00261             )
00262         );
00263 
00264         return std::pair
00265         <
00266             BOOST_DEDUCED_TYPENAME base_::const_iterator,
00267             BOOST_DEDUCED_TYPENAME base_::const_iterator
00268         >(
00269             this->template functor<
00270                 BOOST_DEDUCED_TYPENAME base_::iterator_from_base
00271             >()                                         ( r.first ),
00272             this->template functor<
00273                 BOOST_DEDUCED_TYPENAME base_::iterator_from_base
00274             >()                                         ( r.second )
00275         );
00276     }
00277 
00278 };
00279 
00280 
00281 } // namespace container_adaptor
00282 } // namespace bimaps
00283 } // namespace boost
00284 
00285 
00286 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
00287 
00288 
00289 
Copyright 2006 Matias Capeletto

PrevUpHomeNext