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

PrevUpHomeNext

ordered_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/ordered_associative_container_adaptor.hpp
00010 /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_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/bimap/container_adaptor/detail/comparison_adaptor.hpp>
00023 #include <boost/mpl/if.hpp>
00024 #include <boost/mpl/vector.hpp>
00025 #include <boost/mpl/push_front.hpp>
00026 #include <boost/mpl/aux_/na.hpp>
00027 #include <boost/operators.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,
00039     class ReverseIterator, class ConstReverseIterator, class KeyType,
00040     class IteratorToBaseConverter, class IteratorFromBaseConverter,
00041     class ReverseIteratorFromBaseConverter,
00042     class ValueToBaseConverter, class ValueFromBaseConverter, 
00043     class KeyToBaseConverter,
00044     class FunctorsFromDerivedClasses
00045 >
00046 struct ordered_associative_container_adaptor_base
00047 {
00048     typedef associative_container_adaptor<
00049         Base, Iterator, ConstIterator, KeyType,
00050         IteratorToBaseConverter, IteratorFromBaseConverter,
00051         ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
00052 
00053         BOOST_DEDUCED_TYPENAME mpl::push_front<
00054 
00055             FunctorsFromDerivedClasses,
00056 
00057             BOOST_DEDUCED_TYPENAME mpl::if_<
00058                 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
00059             // {
00060                     detail::iterator_from_base_identity
00061                     <
00062                         BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
00063                         ReverseIterator,
00064                         BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
00065                         ConstReverseIterator
00066                     >,
00067             // }
00068             // else
00069             // {
00070                     ReverseIteratorFromBaseConverter
00071             // }
00072 
00073             >::type
00074 
00075         >::type
00076 
00077     > type;
00078 };
00079 
00080 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
00081 
00082 /// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container.
00083 
00084 template
00085 <
00086     class Base,
00087 
00088     class Iterator,
00089     class ConstIterator,
00090     class ReverseIterator,
00091     class ConstReverseIterator,
00092 
00093     class KeyType,
00094 
00095     class IteratorToBaseConverter          = ::boost::mpl::na,
00096     class IteratorFromBaseConverter        = ::boost::mpl::na,
00097     class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
00098     class ValueToBaseConverter             = ::boost::mpl::na,
00099     class ValueFromBaseConverter           = ::boost::mpl::na,
00100     class KeyToBaseConverter               = ::boost::mpl::na,
00101 
00102     class FunctorsFromDerivedClasses = mpl::vector<>
00103 >
00104 class ordered_associative_container_adaptor :
00105 
00106     public ordered_associative_container_adaptor_base
00107     <
00108         Base, Iterator, ConstIterator,
00109         ReverseIterator, ConstReverseIterator, KeyType,
00110         IteratorToBaseConverter, IteratorFromBaseConverter,
00111         ReverseIteratorFromBaseConverter,
00112         ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
00113         FunctorsFromDerivedClasses
00114 
00115     >::type,
00116 
00117     ::boost::totally_ordered
00118     <
00119         ordered_associative_container_adaptor
00120         <
00121             Base, Iterator, ConstIterator,
00122             ReverseIterator, ConstReverseIterator,
00123             KeyType, IteratorToBaseConverter, IteratorFromBaseConverter,
00124             ReverseIteratorFromBaseConverter,
00125             ValueToBaseConverter, ValueFromBaseConverter,
00126             KeyToBaseConverter, FunctorsFromDerivedClasses
00127         >
00128     >
00129 {
00130     // MetaData -------------------------------------------------------------
00131 
00132     typedef BOOST_DEDUCED_TYPENAME ordered_associative_container_adaptor_base
00133     <
00134         Base, Iterator, ConstIterator,
00135         ReverseIterator, ConstReverseIterator, KeyType,
00136         IteratorToBaseConverter, IteratorFromBaseConverter,
00137         ReverseIteratorFromBaseConverter,
00138         ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter,
00139         FunctorsFromDerivedClasses
00140 
00141     >::type base_;
00142 
00143     public:
00144 
00145     typedef detail::compatible_comparison_adaptor
00146     <
00147         BOOST_DEDUCED_TYPENAME Base::key_compare,
00148         BOOST_DEDUCED_TYPENAME base_::key_type,
00149         BOOST_DEDUCED_TYPENAME base_::key_to_base
00150 
00151     > key_compare;
00152 
00153     typedef detail::comparison_adaptor
00154     <
00155         BOOST_DEDUCED_TYPENAME Base::value_compare,
00156         BOOST_DEDUCED_TYPENAME base_::value_type,
00157         BOOST_DEDUCED_TYPENAME base_::value_to_base
00158 
00159     > value_compare;
00160 
00161     typedef ReverseIterator      reverse_iterator;
00162     typedef ConstReverseIterator const_reverse_iterator;
00163 
00164     protected:
00165 
00166     typedef BOOST_DEDUCED_TYPENAME mpl::if_<
00167         ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
00168         // {
00169                 detail::iterator_from_base_identity
00170                 <
00171                     BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
00172                     reverse_iterator,
00173                     BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
00174                     const_reverse_iterator
00175                 >,
00176         // }
00177         // else
00178         // {
00179                 ReverseIteratorFromBaseConverter
00180         // }
00181 
00182         >::type reverse_iterator_from_base;
00183 
00184     // Access -----------------------------------------------------------------
00185 
00186     public:
00187 
00188     explicit ordered_associative_container_adaptor(Base & c)
00189         : base_(c) {}
00190 
00191     protected:
00192 
00193     typedef ordered_associative_container_adaptor
00194                 ordered_associative_container_adaptor_;
00195 
00196     // Interface --------------------------------------------------------------
00197 
00198     public:
00199 
00200     reverse_iterator rbegin()
00201     {
00202         return this->template functor<
00203             reverse_iterator_from_base
00204         >()                            ( this->base().rbegin() );
00205 
00206     }
00207 
00208     reverse_iterator rend()
00209     {
00210         return this->template functor<
00211             reverse_iterator_from_base
00212         >()                            ( this->base().rend() );
00213     }
00214 
00215     const_reverse_iterator rbegin() const
00216     {
00217         return this->template functor<
00218             reverse_iterator_from_base
00219         >()                            ( this->base().rbegin() );
00220     }
00221 
00222     const_reverse_iterator rend() const
00223     {
00224         return this->template functor<
00225             reverse_iterator_from_base
00226         >()                            ( this->base().rend() );
00227     }
00228 
00229     key_compare key_comp() const
00230     {
00231         typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base_;
00232 
00233         return key_compare(
00234             this->base().key_comp(),
00235             this->template functor<key_to_base_>()
00236         );
00237     }
00238 
00239     value_compare value_comp() const
00240     {
00241         typedef BOOST_DEDUCED_TYPENAME base_::value_to_base value_to_base_;
00242 
00243         return value_compare(
00244             this->base().value_comp(),
00245             this->template functor<value_to_base_>()
00246         );
00247     }
00248 
00249     template< class CompatibleKey >
00250     BOOST_DEDUCED_TYPENAME base_::iterator lower_bound(const CompatibleKey & k)
00251     {
00252        return this->template functor<
00253             BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
00254                 this->base().lower_bound(
00255                     this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
00256                 )
00257             );
00258     }
00259 
00260     template< class CompatibleKey >
00261     BOOST_DEDUCED_TYPENAME base_::const_iterator lower_bound(const CompatibleKey & k) const
00262     {
00263        return this->template functor<
00264             BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
00265                 this->base().lower_bound(
00266                     this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
00267                 )
00268             );
00269     }
00270 
00271     template< class CompatibleKey >
00272     BOOST_DEDUCED_TYPENAME base_::iterator upper_bound(const CompatibleKey & k)
00273     {
00274        return this->template functor<
00275             BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
00276                 this->base().upper_bound(
00277                     this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
00278                 )
00279             );
00280     }
00281 
00282     template< class CompatibleKey >
00283     BOOST_DEDUCED_TYPENAME base_::const_iterator upper_bound(const CompatibleKey & k) const
00284     {
00285         return this->template functor<
00286             BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(
00287                 this->base().upper_bound(
00288                     this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)
00289                 )
00290             );
00291     }
00292 
00293     // Totally ordered implementation
00294 
00295     bool operator==(const ordered_associative_container_adaptor & c) const
00296     {
00297         return ( this->base() == c.base() );
00298     }
00299 
00300     bool operator<(const ordered_associative_container_adaptor & c) const
00301     {
00302         return ( this->base() < c.base() );
00303     }
00304 };
00305 
00306 
00307 } // namespace container_adaptor
00308 } // namespace bimaps
00309 } // namespace boost
00310 
00311 
00312 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP
Copyright 2006 Matias Capeletto

PrevUpHomeNext