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

PrevUpHomeNext

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

PrevUpHomeNext