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

PrevUpHomeNext

list_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_adaptor.hpp
00010 /// \brief Container adaptor to easily build a std::list signature compatible container.
00011 
00012 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_ADAPTOR_HPP
00013 #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_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/sequence_container_adaptor.hpp>
00022 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
00023 #include <boost/mpl/aux_/na.hpp>
00024 #include <boost/mpl/vector.hpp>
00025 #include <boost/call_traits.hpp>
00026 #include <functional>
00027 
00028 namespace boost {
00029 namespace bimaps {
00030 namespace container_adaptor {
00031 
00032 /// \brief Container adaptor to easily build a std::list signature compatible container.
00033 
00034 template
00035 <
00036     class Base,
00037 
00038     class Iterator,
00039     class ConstIterator,
00040     class ReverseIterator,
00041     class ConstReverseIterator,
00042 
00043     class IteratorToBaseConverter          = ::boost::mpl::na,
00044     class IteratorFromBaseConverter        = ::boost::mpl::na,
00045     class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
00046     class ValueToBaseConverter             = ::boost::mpl::na,
00047     class ValueFromBaseConverter           = ::boost::mpl::na,
00048 
00049     class FunctorsFromDerivedClasses = mpl::vector<>
00050 >
00051 class list_adaptor :
00052 
00053     public ::boost::bimaps::container_adaptor::sequence_container_adaptor
00054     <
00055         Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
00056         IteratorToBaseConverter, IteratorFromBaseConverter,
00057         ReverseIteratorFromBaseConverter,
00058         ValueToBaseConverter, ValueFromBaseConverter,
00059         FunctorsFromDerivedClasses
00060     >
00061 {
00062     typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor
00063     <
00064         Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
00065         IteratorToBaseConverter, IteratorFromBaseConverter,
00066         ReverseIteratorFromBaseConverter,
00067         ValueToBaseConverter, ValueFromBaseConverter,
00068         FunctorsFromDerivedClasses
00069 
00070     > base_;
00071 
00072     // Access -----------------------------------------------------------------
00073 
00074     public:
00075 
00076     explicit list_adaptor(Base & c) :
00077         base_(c) {}
00078 
00079     protected:
00080 
00081     typedef list_adaptor list_adaptor_;
00082 
00083     // Interface -------------------------------------------------------------
00084 
00085     public:
00086 
00087     void splice(Iterator position, list_adaptor & x)
00088     {
00089         this->base().splice(
00090             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
00091                 (position),
00092             x.base()
00093         );
00094     }
00095 
00096     void splice(Iterator position, list_adaptor & x, Iterator i)
00097     {
00098         this->base().splice(
00099             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
00100                 (position),
00101             x.base(),
00102             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i)
00103         );
00104     }
00105 
00106     void splice(Iterator position, list_adaptor & x, 
00107                 Iterator first, Iterator last)
00108     {
00109         this->base().splice(
00110             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()
00111                 (position),
00112             x.base(),
00113             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first),
00114             this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last)
00115         );
00116     }
00117 
00118     void remove(
00119         BOOST_DEDUCED_TYPENAME ::boost::call_traits<
00120             BOOST_DEDUCED_TYPENAME base_::value_type
00121         >::param_type value
00122     )
00123     {
00124         this->base().remove(
00125             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value)
00126         );
00127     }
00128 
00129     template< class Predicate >
00130     void remove_if(Predicate pred)
00131     {
00132         this->base().remove_if(
00133             ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
00134             <
00135                 Predicate,
00136                 BOOST_DEDUCED_TYPENAME Base::value_type,
00137                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00138 
00139             >( pred, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
00140         );
00141     }
00142 
00143     void unique()
00144     {
00145         this->base().unique(
00146             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00147             <
00148                 std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>,
00149                 BOOST_DEDUCED_TYPENAME Base::value_type,
00150                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00151 
00152             >(
00153                 std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(),
00154                 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00155             )
00156         );
00157     }
00158 
00159     template< class BinaryPredicate >
00160     void unique(BinaryPredicate binary_pred)
00161     {
00162         this->base().unique(
00163             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00164             <
00165                 BinaryPredicate,
00166                 BOOST_DEDUCED_TYPENAME Base::value_type,
00167                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00168 
00169             >( binary_pred,
00170                this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
00171         );
00172     }
00173 
00174     void merge(list_adaptor & x)
00175     {
00176         this->base().merge(x.base(),
00177             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00178             <
00179                 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
00180                 BOOST_DEDUCED_TYPENAME Base::value_type,
00181                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00182 
00183             >(
00184                 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
00185                 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00186             )
00187         );
00188     }
00189 
00190     template< class Compare >
00191     void merge(list_adaptor & x, Compare comp)
00192     {
00193         this->base().merge(x.base(),
00194             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00195             <
00196                 Compare,
00197                 BOOST_DEDUCED_TYPENAME Base::value_type,
00198                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00199 
00200             >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
00201         );
00202     }
00203 
00204     void sort()
00205     {
00206         this->base().sort(
00207             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00208             <
00209                 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>,
00210                 BOOST_DEDUCED_TYPENAME Base::value_type,
00211                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00212 
00213             >(
00214                 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(),
00215                 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()
00216             )
00217         );
00218     }
00219 
00220     template< class Compare >
00221     void sort(Compare comp)
00222     {
00223         this->base().sort(
00224             ::boost::bimaps::container_adaptor::detail::comparison_adaptor
00225             <
00226                 Compare,
00227                 BOOST_DEDUCED_TYPENAME Base::value_type,
00228                 BOOST_DEDUCED_TYPENAME base_::value_from_base
00229 
00230             >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() )
00231         );
00232     }
00233 
00234     void reverse()
00235     {
00236         this->base().reverse();
00237     }
00238 
00239 };
00240 
00241 
00242 } // namespace container_adaptor
00243 } // namespace bimaps
00244 } // namespace boost
00245 
00246 
00247 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP
00248 
00249 
Copyright 2006 Matias Capeletto

PrevUpHomeNext