• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Bimap
2 //
3 // Copyright (c) 2006-2007 Matias Capeletto
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 /// \file container_adaptor/vector_adaptor.hpp
10 /// \brief Container adaptor to easily build a std::vector signature compatible container.
11 
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP
14 
15 #if defined(_MSC_VER)
16 #pragma once
17 #endif
18 
19 #include <boost/config.hpp>
20 
21 #include <boost/bimap/container_adaptor/sequence_container_adaptor.hpp>
22 #include <boost/mpl/aux_/na.hpp>
23 #include <boost/mpl/vector.hpp>
24 
25 namespace boost {
26 namespace bimaps {
27 namespace container_adaptor {
28 
29 /// \brief Container adaptor to easily build a std::vector signature compatible container.
30 
31 template
32 <
33     class Base,
34 
35     class Iterator,
36     class ConstIterator,
37     class ReverseIterator,
38     class ConstReverseIterator,
39 
40     class IteratorToBaseConverter          = ::boost::mpl::na,
41     class IteratorFromBaseConverter        = ::boost::mpl::na,
42     class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
43     class ValueToBaseConverter             = ::boost::mpl::na,
44     class ValueFromBaseConverter           = ::boost::mpl::na,
45 
46     class FunctorsFromDerivedClasses = mpl::vector<>
47 >
48 class vector_adaptor :
49 
50     public ::boost::bimaps::container_adaptor::sequence_container_adaptor
51     <
52         Base,
53         Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
54         IteratorToBaseConverter, IteratorFromBaseConverter,
55         ReverseIteratorFromBaseConverter,
56         ValueToBaseConverter, ValueFromBaseConverter,
57         FunctorsFromDerivedClasses
58     >
59 {
60 
61     typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor
62     <
63         Base,
64         Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
65         IteratorToBaseConverter, IteratorFromBaseConverter,
66         ReverseIteratorFromBaseConverter,
67         ValueToBaseConverter, ValueFromBaseConverter,
68         FunctorsFromDerivedClasses
69 
70     > base_;
71 
72     // Access -----------------------------------------------------------------
73 
74     public:
75 
vector_adaptor()76     vector_adaptor() {}
77 
vector_adaptor(Base & c)78     explicit vector_adaptor(Base & c) :
79         base_(c) {}
80 
81     protected:
82 
83     typedef vector_adaptor vector_adaptor_;
84 
85     // Interface --------------------------------------------------------------
86 
87     public:
88 
capacity() const89     BOOST_DEDUCED_TYPENAME base_::size_type capacity() const
90     {
91         return this->base().capacity();
92     }
93 
reserve(BOOST_DEDUCED_TYPENAME base_::size_type m)94     void reserve(BOOST_DEDUCED_TYPENAME base_::size_type m)
95     {
96         this->base().resize(m);
97     }
98 
resize(BOOST_DEDUCED_TYPENAME base_::size_type n,BOOST_DEDUCED_TYPENAME::boost::call_traits<BOOST_DEDUCED_TYPENAME base_::value_type>::param_type x=BOOST_DEDUCED_TYPENAME base_::value_type ())99     void resize(BOOST_DEDUCED_TYPENAME base_::size_type n,
100                 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
101                     BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x =
102                         BOOST_DEDUCED_TYPENAME base_::value_type())
103     {
104         this->base().resize(n,
105             this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)
106         );
107     }
108 
109     BOOST_DEDUCED_TYPENAME base_::const_reference
operator [](BOOST_DEDUCED_TYPENAME base_::size_type n) const110         operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const
111     {
112         return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
113             this->base().operator[](n)
114         );
115     }
116 
117     BOOST_DEDUCED_TYPENAME base_::const_reference
at(BOOST_DEDUCED_TYPENAME base_::size_type n) const118         at(BOOST_DEDUCED_TYPENAME base_::size_type n) const
119     {
120         return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
121             this->base().at(n)
122         );
123     }
124 
125     BOOST_DEDUCED_TYPENAME base_::reference
operator [](BOOST_DEDUCED_TYPENAME base_::size_type n)126         operator[](BOOST_DEDUCED_TYPENAME base_::size_type n)
127     {
128         return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
129             this->base().operator[](n)
130         );
131     }
132 
133     BOOST_DEDUCED_TYPENAME base_::reference
at(BOOST_DEDUCED_TYPENAME base_::size_type n)134         at(BOOST_DEDUCED_TYPENAME base_::size_type n)
135     {
136         return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()(
137             this->base().at(n)
138         );
139     }
140 };
141 
142 
143 } // namespace container_adaptor
144 } // namespace bimaps
145 } // namespace boost
146 
147 
148 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP
149 
150 
151