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

PrevUpHomeNext

sequence_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/sequence_container_adaptor.hpp
00010 /// \brief Container adaptor to build a type that is compliant to the concept of a weak associative container.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_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/if.hpp>
00024 #include <boost/mpl/vector.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,
00039     class ReverseIterator, class ConstReverseIterator,
00040     class IteratorToBaseConverter, class IteratorFromBaseConverter,
00041     class ReverseIteratorFromBaseConverter,
00042     class ValueToBaseConverter, class ValueFromBaseConverter,
00043     class FunctorsFromDerivedClasses
00044 >
00045 struct sequence_container_adaptor_base
00046 {
00047     typedef container_adaptor
00048     <
00049         Base, Iterator, ConstIterator,
00050         IteratorToBaseConverter, IteratorFromBaseConverter,
00051         ValueToBaseConverter, ValueFromBaseConverter,
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 a sequence container.
00083 
00084 template
00085 <
00086     class Base,
00087 
00088     class Iterator,
00089     class ConstIterator,
00090 
00091     class ReverseIterator,
00092     class ConstReverseIterator,
00093 
00094     class IteratorToBaseConverter           = ::boost::mpl::na,
00095     class IteratorFromBaseConverter         = ::boost::mpl::na,
00096     class ReverseIteratorFromBaseConverter  = ::boost::mpl::na,
00097     class ValueToBaseConverter              = ::boost::mpl::na,
00098     class ValueFromBaseConverter            = ::boost::mpl::na,
00099 
00100     class FunctorsFromDerivedClasses = mpl::vector<>
00101 >
00102 class sequence_container_adaptor :
00103 
00104     public sequence_container_adaptor_base
00105     <
00106         Base, Iterator, ConstIterator,
00107         ReverseIterator, ConstReverseIterator,
00108         IteratorToBaseConverter, IteratorFromBaseConverter,
00109         ReverseIteratorFromBaseConverter,
00110         ValueToBaseConverter, ValueFromBaseConverter,
00111         FunctorsFromDerivedClasses
00112 
00113     >::type,
00114 
00115     ::boost::totally_ordered
00116     <
00117         sequence_container_adaptor
00118         <
00119             Base, Iterator, ConstIterator,
00120             ReverseIterator, ConstReverseIterator,
00121             IteratorToBaseConverter, IteratorFromBaseConverter,
00122             ReverseIteratorFromBaseConverter,
00123             ValueToBaseConverter, ValueFromBaseConverter,
00124             FunctorsFromDerivedClasses
00125         >
00126     >
00127 {
00128     typedef BOOST_DEDUCED_TYPENAME sequence_container_adaptor_base
00129     <
00130         Base, Iterator, ConstIterator,
00131         ReverseIterator, ConstReverseIterator,
00132         IteratorToBaseConverter, IteratorFromBaseConverter,
00133         ReverseIteratorFromBaseConverter,
00134         ValueToBaseConverter, ValueFromBaseConverter,
00135         FunctorsFromDerivedClasses
00136 
00137     >::type base_;
00138 
00139     // MetaData -------------------------------------------------------------
00140 
00141     public:
00142 
00143     typedef ReverseIterator      reverse_iterator;
00144     typedef ConstReverseIterator const_reverse_iterator;
00145 
00146     protected:
00147 
00148     typedef BOOST_DEDUCED_TYPENAME mpl::if_<
00149         ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
00150         // {
00151                 detail::iterator_from_base_identity
00152                 <
00153                     BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
00154                     reverse_iterator,
00155                     BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
00156                     const_reverse_iterator
00157                 >,
00158         // }
00159         // else
00160         // {
00161                 ReverseIteratorFromBaseConverter
00162         // }
00163 
00164         >::type reverse_iterator_from_base;
00165 
00166 
00167     // Access -----------------------------------------------------------------
00168 
00169     public:
00170 
00171     explicit sequence_container_adaptor(Base & c)
00172         : base_(c) {}
00173 
00174     protected:
00175 
00176 
00177     typedef sequence_container_adaptor sequence_container_adaptor_;
00178 
00179     // Interface --------------------------------------------------------------
00180 
00181     public:
00182 
00183     reverse_iterator rbegin()
00184     {
00185         return this->template functor<
00186             reverse_iterator_from_base
00187         >()                            ( this->base().rbegin() );
00188 
00189     }
00190 
00191     reverse_iterator rend()
00192     {
00193         return this->template functor<
00194             reverse_iterator_from_base
00195         >()                            ( this->base().rend() );
00196     }
00197 
00198     const_reverse_iterator rbegin() const
00199     {
00200         return this->template functor<
00201             reverse_iterator_from_base
00202         >()                            ( this->base().rbegin() );
00203     }
00204 
00205     const_reverse_iterator rend() const
00206     {
00207         return this->template functor<
00208             reverse_iterator_from_base
00209         >()                            ( this->base().rend() );
00210     }
00211 
00212     void resize(BOOST_DEDUCED_TYPENAME base_::size_type n,
00213                 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
00214                     BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x =
00215                         BOOST_DEDUCED_TYPENAME base_::value_type())
00216     {
00217         this->base().resize(n,
00218             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)
00219         );
00220     }
00221 
00222     BOOST_DEDUCED_TYPENAME base_::reference front()
00223     {
00224         return this->template functor<
00225             BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00226         (
00227             this->base().front()
00228         );
00229     }
00230 
00231     BOOST_DEDUCED_TYPENAME base_::reference back()
00232     {
00233         return this->template functor<
00234             BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00235         (
00236             this->base().back()
00237         );
00238     }
00239 
00240     BOOST_DEDUCED_TYPENAME base_::const_reference front() const
00241     {
00242         return this->template functor<
00243             BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00244         (
00245             this->base().front()
00246         );
00247     }
00248 
00249     BOOST_DEDUCED_TYPENAME base_::const_reference back() const
00250     {
00251         return this->template functor<
00252             BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00253         (
00254             this->base().back()
00255         );
00256     }
00257 
00258     void push_front(
00259         BOOST_DEDUCED_TYPENAME ::boost::call_traits<
00260             BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
00261     {
00262         this->base().push_front(
00263             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
00264     }
00265 
00266     void pop_front()
00267     {
00268         this->base().pop_front();
00269     }
00270 
00271     void push_back(
00272         BOOST_DEDUCED_TYPENAME ::boost::call_traits< 
00273             BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
00274     {
00275         this->base().push_back(
00276             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
00277     }
00278 
00279     void pop_back()
00280     {
00281         this->base().pop_back();
00282     }
00283 
00284     std::pair<BOOST_DEDUCED_TYPENAME base_::iterator,bool>
00285     insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
00286            BOOST_DEDUCED_TYPENAME ::boost::call_traits< 
00287                 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
00288     {
00289         std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r(
00290             this->base().insert(
00291                 this->template functor<
00292                     BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
00293                 this->template functor<
00294                     BOOST_DEDUCED_TYPENAME base_::value_to_base   >()(x)
00295             )
00296         );
00297 
00298         return std::pair<BOOST_DEDUCED_TYPENAME base_::iterator, bool>(
00299             this->template functor<
00300                 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first),
00301             r.second
00302         );
00303     }
00304 
00305     void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
00306                 BOOST_DEDUCED_TYPENAME base_::size_type m,
00307                 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
00308                     BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
00309     {
00310         this->base().insert(
00311             this->template functor<
00312                 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
00313             m,
00314             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base   >()(x)
00315         );
00316     }
00317 
00318     template< class InputIterator >
00319     void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
00320                 InputIterator first, InputIterator last)
00321     {
00322         // This is the same problem found in the insert function 
00323         // of container_adaptor
00324         // For now, do the simple thing. This can be optimized
00325 
00326         for( ; first != last ; ++first )
00327         {
00328             this->base().insert(
00329                 this->template functor<
00330                     BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()( position ),
00331                 this->template functor<
00332                     BOOST_DEDUCED_TYPENAME base_::value_to_base   >()( *first )
00333             );
00334         }
00335     }
00336 
00337     // Totally ordered implementation
00338 
00339     bool operator==(const sequence_container_adaptor & c) const
00340     {
00341         return ( this->base() == c.base() );
00342     }
00343 
00344     bool operator<(const sequence_container_adaptor & c) const
00345     {
00346         return ( this->base() < c.base() );
00347     }
00348 };
00349 
00350 } // namespace container_adaptor
00351 } // namespace bimaps
00352 } // namespace boost
00353 
00354 
00355 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP
Copyright 2006 Matias Capeletto

PrevUpHomeNext