xref: /trunk/main/autodoc/inc/cosv/tpl/vvector.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1*11c03c6dSDamjan Jovanovic /**************************************************************
2*11c03c6dSDamjan Jovanovic  *
3*11c03c6dSDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*11c03c6dSDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*11c03c6dSDamjan Jovanovic  * distributed with this work for additional information
6*11c03c6dSDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*11c03c6dSDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*11c03c6dSDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*11c03c6dSDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*11c03c6dSDamjan Jovanovic  *
11*11c03c6dSDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*11c03c6dSDamjan Jovanovic  *
13*11c03c6dSDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*11c03c6dSDamjan Jovanovic  * software distributed under the License is distributed on an
15*11c03c6dSDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*11c03c6dSDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*11c03c6dSDamjan Jovanovic  * specific language governing permissions and limitations
18*11c03c6dSDamjan Jovanovic  * under the License.
19*11c03c6dSDamjan Jovanovic  *
20*11c03c6dSDamjan Jovanovic  *************************************************************/
21*11c03c6dSDamjan Jovanovic 
22*11c03c6dSDamjan Jovanovic 
23*11c03c6dSDamjan Jovanovic 
24*11c03c6dSDamjan Jovanovic #ifndef CSV_VVECTOR_HXX
25*11c03c6dSDamjan Jovanovic #define CSV_VVECTOR_HXX
26*11c03c6dSDamjan Jovanovic 
27*11c03c6dSDamjan Jovanovic #include <cstddef>      // for ptrdiff_t
28*11c03c6dSDamjan Jovanovic 
29*11c03c6dSDamjan Jovanovic // USED SERVICES
30*11c03c6dSDamjan Jovanovic #include <vector>
31*11c03c6dSDamjan Jovanovic #include <cosv/tpl/tpltools.hxx>
32*11c03c6dSDamjan Jovanovic 
33*11c03c6dSDamjan Jovanovic 
34*11c03c6dSDamjan Jovanovic 
35*11c03c6dSDamjan Jovanovic 
36*11c03c6dSDamjan Jovanovic namespace csv
37*11c03c6dSDamjan Jovanovic {
38*11c03c6dSDamjan Jovanovic namespace vvector
39*11c03c6dSDamjan Jovanovic {
40*11c03c6dSDamjan Jovanovic 
41*11c03c6dSDamjan Jovanovic 
42*11c03c6dSDamjan Jovanovic template <class TYPE>
43*11c03c6dSDamjan Jovanovic struct delete_ptrs
44*11c03c6dSDamjan Jovanovic {
Destructcsv::vvector::delete_ptrs45*11c03c6dSDamjan Jovanovic     static void         Destruct(
46*11c03c6dSDamjan Jovanovic                             std::vector< TYPE* > &
47*11c03c6dSDamjan Jovanovic                                                 v)
48*11c03c6dSDamjan Jovanovic                         { csv::erase_container_of_heap_ptrs(v); }
49*11c03c6dSDamjan Jovanovic 
50*11c03c6dSDamjan Jovanovic     /// @precond ->it is a valid iterator within v
Erasecsv::vvector::delete_ptrs51*11c03c6dSDamjan Jovanovic     static void         Erase(
52*11c03c6dSDamjan Jovanovic                             std::vector< TYPE* > &
53*11c03c6dSDamjan Jovanovic                                                 v,
54*11c03c6dSDamjan Jovanovic                             typename std::vector< TYPE* >::iterator
55*11c03c6dSDamjan Jovanovic                                                 it2erase )
56*11c03c6dSDamjan Jovanovic                         { delete *it2erase; v.erase(it2erase); }
57*11c03c6dSDamjan Jovanovic 
58*11c03c6dSDamjan Jovanovic     /// @precond ->v.size() > 0
PopBackcsv::vvector::delete_ptrs59*11c03c6dSDamjan Jovanovic     static void         PopBack(
60*11c03c6dSDamjan Jovanovic                             std::vector< TYPE* > &
61*11c03c6dSDamjan Jovanovic                                                 v )
62*11c03c6dSDamjan Jovanovic                         { delete v.back(); v.pop_back(); }
63*11c03c6dSDamjan Jovanovic 
64*11c03c6dSDamjan Jovanovic     /// @precond ->it is a valid iterator
ReplacePtrcsv::vvector::delete_ptrs65*11c03c6dSDamjan Jovanovic     static void         ReplacePtr(
66*11c03c6dSDamjan Jovanovic                             typename std::vector< TYPE* >::iterator
67*11c03c6dSDamjan Jovanovic                                                 it,
68*11c03c6dSDamjan Jovanovic                             DYN TYPE *          pass_new )
69*11c03c6dSDamjan Jovanovic                         { delete *it; *it = pass_new; }
70*11c03c6dSDamjan Jovanovic };
71*11c03c6dSDamjan Jovanovic 
72*11c03c6dSDamjan Jovanovic 
73*11c03c6dSDamjan Jovanovic /** One helper class for the ->csv::VirtualVector.
74*11c03c6dSDamjan Jovanovic     Implements a
75*11c03c6dSDamjan Jovanovic */
76*11c03c6dSDamjan Jovanovic template <class TYPE>
77*11c03c6dSDamjan Jovanovic struct keep_ptrs
78*11c03c6dSDamjan Jovanovic {
Destructcsv::vvector::keep_ptrs79*11c03c6dSDamjan Jovanovic     static void         Destruct(std::vector< TYPE* > & v)
80*11c03c6dSDamjan Jovanovic                         {}
81*11c03c6dSDamjan Jovanovic 
Erasecsv::vvector::keep_ptrs82*11c03c6dSDamjan Jovanovic     static void         Erase(
83*11c03c6dSDamjan Jovanovic                             std::vector< TYPE* > &
84*11c03c6dSDamjan Jovanovic                                                 v,
85*11c03c6dSDamjan Jovanovic                             typename std::vector< TYPE* >::iterator
86*11c03c6dSDamjan Jovanovic                                                 it2erase )
87*11c03c6dSDamjan Jovanovic                         { v.erase(it2erase); }
88*11c03c6dSDamjan Jovanovic 
PopBackcsv::vvector::keep_ptrs89*11c03c6dSDamjan Jovanovic     static void         PopBack(
90*11c03c6dSDamjan Jovanovic                             std::vector< TYPE* > &
91*11c03c6dSDamjan Jovanovic                                                 v )
92*11c03c6dSDamjan Jovanovic                         { v.pop_back(); }
93*11c03c6dSDamjan Jovanovic 
94*11c03c6dSDamjan Jovanovic     /// @precond ->it is a valid iterator
ReplacePtrcsv::vvector::keep_ptrs95*11c03c6dSDamjan Jovanovic     static void         ReplacePtr(
96*11c03c6dSDamjan Jovanovic                             typename std::vector< TYPE* >::iterator
97*11c03c6dSDamjan Jovanovic                                                 it,
98*11c03c6dSDamjan Jovanovic                             TYPE *              io_new )
99*11c03c6dSDamjan Jovanovic                         { *it = io_new; }
100*11c03c6dSDamjan Jovanovic };
101*11c03c6dSDamjan Jovanovic 
102*11c03c6dSDamjan Jovanovic 
103*11c03c6dSDamjan Jovanovic }   // namespace vvector
104*11c03c6dSDamjan Jovanovic 
105*11c03c6dSDamjan Jovanovic 
106*11c03c6dSDamjan Jovanovic 
107*11c03c6dSDamjan Jovanovic 
108*11c03c6dSDamjan Jovanovic /** Implements a vector of different implementations of a base
109*11c03c6dSDamjan Jovanovic     class.
110*11c03c6dSDamjan Jovanovic 
111*11c03c6dSDamjan Jovanovic     Implementation has to be by pointers to get the polymorphic
112*11c03c6dSDamjan Jovanovic     behaviour, however access is by references to the base class.
113*11c03c6dSDamjan Jovanovic 
114*11c03c6dSDamjan Jovanovic     @tpl XX
115*11c03c6dSDamjan Jovanovic     The common base class of vector elements.
116*11c03c6dSDamjan Jovanovic 
117*11c03c6dSDamjan Jovanovic     @tpl PTRDEL
118*11c03c6dSDamjan Jovanovic     Has two possible values:
119*11c03c6dSDamjan Jovanovic         vvector::delete_ptrs<XX>    Elements have to be on the heap and
120*11c03c6dSDamjan Jovanovic                                     are deleted when removed (default).
121*11c03c6dSDamjan Jovanovic         vvector::keep_ptrs<XX>      Elements are only referenced and not
122*11c03c6dSDamjan Jovanovic                                     deleted when removed.
123*11c03c6dSDamjan Jovanovic 
124*11c03c6dSDamjan Jovanovic */
125*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL = vvector::delete_ptrs<XX> >
126*11c03c6dSDamjan Jovanovic class VirtualVector
127*11c03c6dSDamjan Jovanovic {
128*11c03c6dSDamjan Jovanovic   public:
129*11c03c6dSDamjan Jovanovic     typedef VirtualVector<XX,PTRDEL>            self;
130*11c03c6dSDamjan Jovanovic     typedef std::vector< DYN XX* >              impl_type;
131*11c03c6dSDamjan Jovanovic     typedef typename impl_type::size_type       size_type;
132*11c03c6dSDamjan Jovanovic     typedef ptrdiff_t                           difference_type;
133*11c03c6dSDamjan Jovanovic 
134*11c03c6dSDamjan Jovanovic     class const_iterator;
135*11c03c6dSDamjan Jovanovic     class iterator;
136*11c03c6dSDamjan Jovanovic 
137*11c03c6dSDamjan Jovanovic     // LIFECYCLE
138*11c03c6dSDamjan Jovanovic                         VirtualVector();
139*11c03c6dSDamjan Jovanovic     explicit            VirtualVector(
140*11c03c6dSDamjan Jovanovic                             int                 i_size );
141*11c03c6dSDamjan Jovanovic                         ~VirtualVector();
142*11c03c6dSDamjan Jovanovic 
143*11c03c6dSDamjan Jovanovic     // OPERATORS
144*11c03c6dSDamjan Jovanovic     const XX &          operator[](
145*11c03c6dSDamjan Jovanovic                             size_type           i_pos ) const;
146*11c03c6dSDamjan Jovanovic     XX &                operator[](
147*11c03c6dSDamjan Jovanovic                             size_type           i_pos );
148*11c03c6dSDamjan Jovanovic 
149*11c03c6dSDamjan Jovanovic     // OPERATIONS
150*11c03c6dSDamjan Jovanovic     void                push_back(
151*11c03c6dSDamjan Jovanovic                             DYN XX &            i_drElement );
152*11c03c6dSDamjan Jovanovic     void                pop_back();
153*11c03c6dSDamjan Jovanovic 
154*11c03c6dSDamjan Jovanovic     iterator            insert(
155*11c03c6dSDamjan Jovanovic                             iterator            i_pos,
156*11c03c6dSDamjan Jovanovic                             DYN XX &            i_drElement );
157*11c03c6dSDamjan Jovanovic     void                erase(
158*11c03c6dSDamjan Jovanovic                             iterator            i_pos );
159*11c03c6dSDamjan Jovanovic     void                replace(
160*11c03c6dSDamjan Jovanovic                             iterator            i_pos,
161*11c03c6dSDamjan Jovanovic                             DYN XX &            i_drElement );
162*11c03c6dSDamjan Jovanovic     void                reserve(
163*11c03c6dSDamjan Jovanovic                             size_type           i_size );
164*11c03c6dSDamjan Jovanovic 
165*11c03c6dSDamjan Jovanovic     // INQUIRY
166*11c03c6dSDamjan Jovanovic     bool                empty() const;
167*11c03c6dSDamjan Jovanovic     size_t              size() const;
168*11c03c6dSDamjan Jovanovic     const_iterator      begin() const;
169*11c03c6dSDamjan Jovanovic     const_iterator      end() const;
170*11c03c6dSDamjan Jovanovic     const XX &          front() const;
171*11c03c6dSDamjan Jovanovic     const XX &          back() const;
172*11c03c6dSDamjan Jovanovic 
173*11c03c6dSDamjan Jovanovic     // ACCESS
174*11c03c6dSDamjan Jovanovic     iterator            begin();
175*11c03c6dSDamjan Jovanovic     iterator            end();
176*11c03c6dSDamjan Jovanovic     XX &                front();
177*11c03c6dSDamjan Jovanovic     XX &                back();
178*11c03c6dSDamjan Jovanovic 
179*11c03c6dSDamjan Jovanovic   private:
180*11c03c6dSDamjan Jovanovic     // Forbidden:
181*11c03c6dSDamjan Jovanovic                         VirtualVector(const VirtualVector&);
182*11c03c6dSDamjan Jovanovic     VirtualVector &     operator=(const VirtualVector&);
183*11c03c6dSDamjan Jovanovic 
184*11c03c6dSDamjan Jovanovic     // DATA
185*11c03c6dSDamjan Jovanovic     std::vector< DYN XX* >
186*11c03c6dSDamjan Jovanovic                         aData;
187*11c03c6dSDamjan Jovanovic };
188*11c03c6dSDamjan Jovanovic 
189*11c03c6dSDamjan Jovanovic 
190*11c03c6dSDamjan Jovanovic 
191*11c03c6dSDamjan Jovanovic 
192*11c03c6dSDamjan Jovanovic /** Should be usable for all STL algorithms.
193*11c03c6dSDamjan Jovanovic     Implements the Random Access Iterator concept.
194*11c03c6dSDamjan Jovanovic */
195*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
196*11c03c6dSDamjan Jovanovic class VirtualVector<XX,PTRDEL>::
197*11c03c6dSDamjan Jovanovic       const_iterator
198*11c03c6dSDamjan Jovanovic 
199*11c03c6dSDamjan Jovanovic             // This derivation provides type information for the STL
200*11c03c6dSDamjan Jovanovic             // It introduces the types "value_type" and "difference_type".
201*11c03c6dSDamjan Jovanovic             : public std::iterator<std::random_access_iterator_tag,
202*11c03c6dSDamjan Jovanovic                         const XX>
203*11c03c6dSDamjan Jovanovic {
204*11c03c6dSDamjan Jovanovic   public:
205*11c03c6dSDamjan Jovanovic     typedef VirtualVector<XX,PTRDEL>                            my_container;
206*11c03c6dSDamjan Jovanovic     typedef typename my_container::impl_type::const_iterator    impl_iterator;
207*11c03c6dSDamjan Jovanovic 
208*11c03c6dSDamjan Jovanovic     // LIFECYCLE
const_iterator(impl_iterator i_implIter)209*11c03c6dSDamjan Jovanovic                         const_iterator(
210*11c03c6dSDamjan Jovanovic                             impl_iterator       i_implIter )
211*11c03c6dSDamjan Jovanovic                             : itImpl(i_implIter) {}
212*11c03c6dSDamjan Jovanovic 
213*11c03c6dSDamjan Jovanovic 
214*11c03c6dSDamjan Jovanovic     ///////////      STL ITERATOR CONCEPT IMPLEMENTATION        //////////////
215*11c03c6dSDamjan Jovanovic 
216*11c03c6dSDamjan Jovanovic     // Default Constructible functions:
const_iterator()217*11c03c6dSDamjan Jovanovic                         const_iterator()
218*11c03c6dSDamjan Jovanovic                             : itImpl() {}
219*11c03c6dSDamjan Jovanovic 
220*11c03c6dSDamjan Jovanovic     // Assignable functions:
221*11c03c6dSDamjan Jovanovic         // Assignment and copy constructor use the compiler generated versions.
222*11c03c6dSDamjan Jovanovic 
223*11c03c6dSDamjan Jovanovic     // Equality Comparable functions:
operator ==(const_iterator i_other) const224*11c03c6dSDamjan Jovanovic     bool                operator==(
225*11c03c6dSDamjan Jovanovic                             const_iterator      i_other ) const
226*11c03c6dSDamjan Jovanovic                             { return itImpl == i_other.itImpl; }
operator !=(const_iterator i_other) const227*11c03c6dSDamjan Jovanovic     bool                operator!=(
228*11c03c6dSDamjan Jovanovic                             const_iterator      i_other ) const
229*11c03c6dSDamjan Jovanovic                             { return itImpl != i_other.itImpl; }
230*11c03c6dSDamjan Jovanovic 
231*11c03c6dSDamjan Jovanovic     // Trivial Iterator functions:
operator *() const232*11c03c6dSDamjan Jovanovic     const XX &          operator*() const
233*11c03c6dSDamjan Jovanovic                             { return *(*itImpl); }
234*11c03c6dSDamjan Jovanovic 
235*11c03c6dSDamjan Jovanovic     // Input Iterator functions:
operator ++()236*11c03c6dSDamjan Jovanovic     const_iterator &    operator++()
237*11c03c6dSDamjan Jovanovic                             { ++itImpl; return *this; }
operator ++(int)238*11c03c6dSDamjan Jovanovic     const_iterator      operator++(int)
239*11c03c6dSDamjan Jovanovic                             { return const_iterator(itImpl++); }
240*11c03c6dSDamjan Jovanovic 
241*11c03c6dSDamjan Jovanovic     // Bidirectional Iterator functions:
operator --()242*11c03c6dSDamjan Jovanovic     const_iterator &    operator--()
243*11c03c6dSDamjan Jovanovic                             { --itImpl; return *this; }
operator --(int)244*11c03c6dSDamjan Jovanovic     const_iterator      operator--(int)
245*11c03c6dSDamjan Jovanovic                             { return const_iterator(itImpl--); }
246*11c03c6dSDamjan Jovanovic 
247*11c03c6dSDamjan Jovanovic     // Less Than Comparable functions:
operator <(const_iterator i_other) const248*11c03c6dSDamjan Jovanovic     bool                operator<(
249*11c03c6dSDamjan Jovanovic                             const_iterator      i_other ) const
250*11c03c6dSDamjan Jovanovic                             { return itImpl < i_other.itImpl; }
251*11c03c6dSDamjan Jovanovic 
252*11c03c6dSDamjan Jovanovic     // Random Access Iterator functions:
operator +=(difference_type i_diff)253*11c03c6dSDamjan Jovanovic     const_iterator &    operator+=(
254*11c03c6dSDamjan Jovanovic                             difference_type     i_diff )
255*11c03c6dSDamjan Jovanovic                             { itImpl += i_diff; return *this; }
operator +(difference_type i_diff) const256*11c03c6dSDamjan Jovanovic     const_iterator      operator+(
257*11c03c6dSDamjan Jovanovic                             difference_type     i_diff ) const
258*11c03c6dSDamjan Jovanovic                             { const_iterator ret(itImpl);
259*11c03c6dSDamjan Jovanovic                               return ret += i_diff; }
operator -=(difference_type i_diff)260*11c03c6dSDamjan Jovanovic     const_iterator &    operator-=(
261*11c03c6dSDamjan Jovanovic                             difference_type     i_diff )
262*11c03c6dSDamjan Jovanovic                             { itImpl -= i_diff;  return *this; }
operator -(difference_type i_diff) const263*11c03c6dSDamjan Jovanovic     const_iterator      operator-(
264*11c03c6dSDamjan Jovanovic                             difference_type     i_diff ) const
265*11c03c6dSDamjan Jovanovic                             { const_iterator ret(itImpl);
266*11c03c6dSDamjan Jovanovic                               return ret -= i_diff; }
operator -(const_iterator i_it) const267*11c03c6dSDamjan Jovanovic     difference_type     operator-(
268*11c03c6dSDamjan Jovanovic                             const_iterator      i_it ) const
269*11c03c6dSDamjan Jovanovic                             { return itImpl - i_it.itImpl; }
operator [](difference_type i_index)270*11c03c6dSDamjan Jovanovic     const XX &          operator[](
271*11c03c6dSDamjan Jovanovic                             difference_type     i_index )
272*11c03c6dSDamjan Jovanovic                             { return *(*itImpl[i_index]); }
273*11c03c6dSDamjan Jovanovic 
274*11c03c6dSDamjan Jovanovic     //////////////////////////////////////////////////////////////////////////
275*11c03c6dSDamjan Jovanovic 
276*11c03c6dSDamjan Jovanovic   private:
277*11c03c6dSDamjan Jovanovic     friend class VirtualVector<XX,PTRDEL>;
ImplValue() const278*11c03c6dSDamjan Jovanovic     impl_iterator       ImplValue() const       { return itImpl; }
279*11c03c6dSDamjan Jovanovic 
280*11c03c6dSDamjan Jovanovic     // DATA
281*11c03c6dSDamjan Jovanovic     impl_iterator       itImpl;
282*11c03c6dSDamjan Jovanovic };
283*11c03c6dSDamjan Jovanovic 
284*11c03c6dSDamjan Jovanovic 
285*11c03c6dSDamjan Jovanovic 
286*11c03c6dSDamjan Jovanovic 
287*11c03c6dSDamjan Jovanovic /** Should be usable for all STL algorithms.
288*11c03c6dSDamjan Jovanovic     Implements the Random Access Iterator concept.
289*11c03c6dSDamjan Jovanovic */
290*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
291*11c03c6dSDamjan Jovanovic class VirtualVector<XX,PTRDEL>::
292*11c03c6dSDamjan Jovanovic       iterator
293*11c03c6dSDamjan Jovanovic 
294*11c03c6dSDamjan Jovanovic             // This derivation provides type information for the STL
295*11c03c6dSDamjan Jovanovic             // It introduces the types "value_type" and "difference_type".
296*11c03c6dSDamjan Jovanovic             : public std::iterator<std::random_access_iterator_tag,
297*11c03c6dSDamjan Jovanovic                         XX>
298*11c03c6dSDamjan Jovanovic {
299*11c03c6dSDamjan Jovanovic   public:
300*11c03c6dSDamjan Jovanovic     typedef VirtualVector<XX,PTRDEL>                            my_container;
301*11c03c6dSDamjan Jovanovic     typedef typename my_container::impl_type::iterator          impl_iterator;
302*11c03c6dSDamjan Jovanovic 
303*11c03c6dSDamjan Jovanovic     // LIFECYCLE
iterator(impl_iterator i_implIter)304*11c03c6dSDamjan Jovanovic                         iterator(
305*11c03c6dSDamjan Jovanovic                             impl_iterator       i_implIter )
306*11c03c6dSDamjan Jovanovic                             : itImpl(i_implIter) {}
307*11c03c6dSDamjan Jovanovic 
308*11c03c6dSDamjan Jovanovic 
309*11c03c6dSDamjan Jovanovic     ///////////      STL ITERATOR CONCEPT IMPLEMENTATION        //////////////
310*11c03c6dSDamjan Jovanovic 
311*11c03c6dSDamjan Jovanovic     // Default Constructible functions:
iterator()312*11c03c6dSDamjan Jovanovic                         iterator()
313*11c03c6dSDamjan Jovanovic                             : itImpl() {}
314*11c03c6dSDamjan Jovanovic 
315*11c03c6dSDamjan Jovanovic     // Assignable functions:
316*11c03c6dSDamjan Jovanovic         // Assignment and copy constructor use the compiler generated versions.
317*11c03c6dSDamjan Jovanovic 
318*11c03c6dSDamjan Jovanovic     // Equality Comparable functions:
operator ==(iterator i_other) const319*11c03c6dSDamjan Jovanovic     bool                operator==(
320*11c03c6dSDamjan Jovanovic                             iterator            i_other ) const
321*11c03c6dSDamjan Jovanovic                             { return itImpl == i_other.itImpl; }
operator !=(iterator i_other) const322*11c03c6dSDamjan Jovanovic     bool                operator!=(
323*11c03c6dSDamjan Jovanovic                             iterator            i_other ) const
324*11c03c6dSDamjan Jovanovic                             { return itImpl != i_other.itImpl; }
325*11c03c6dSDamjan Jovanovic 
326*11c03c6dSDamjan Jovanovic     // Trivial Iterator functions:
operator *() const327*11c03c6dSDamjan Jovanovic     XX &                operator*() const
328*11c03c6dSDamjan Jovanovic                             { return *(*itImpl); }
329*11c03c6dSDamjan Jovanovic 
330*11c03c6dSDamjan Jovanovic     // Input Iterator functions:
operator ++()331*11c03c6dSDamjan Jovanovic     iterator &          operator++()
332*11c03c6dSDamjan Jovanovic                             { ++itImpl; return *this; }
operator ++(int)333*11c03c6dSDamjan Jovanovic     iterator            operator++(int)
334*11c03c6dSDamjan Jovanovic                             { return iterator(itImpl++); }
335*11c03c6dSDamjan Jovanovic 
336*11c03c6dSDamjan Jovanovic     // Bidirectional Iterator functions:
operator --()337*11c03c6dSDamjan Jovanovic     iterator &          operator--()
338*11c03c6dSDamjan Jovanovic                             { --itImpl; return *this; }
operator --(int)339*11c03c6dSDamjan Jovanovic     iterator            operator--(int)
340*11c03c6dSDamjan Jovanovic                             { return iterator(itImpl--); }
341*11c03c6dSDamjan Jovanovic 
342*11c03c6dSDamjan Jovanovic     // Less Than Comparable functions:
operator <(iterator i_other) const343*11c03c6dSDamjan Jovanovic     bool                operator<(
344*11c03c6dSDamjan Jovanovic                             iterator            i_other ) const
345*11c03c6dSDamjan Jovanovic                             { return itImpl < i_other.itImpl; }
346*11c03c6dSDamjan Jovanovic 
347*11c03c6dSDamjan Jovanovic     // Random Access Iterator functions:
operator +=(difference_type i_diff)348*11c03c6dSDamjan Jovanovic     iterator &          operator+=(
349*11c03c6dSDamjan Jovanovic                             difference_type     i_diff )
350*11c03c6dSDamjan Jovanovic                             { itImpl += i_diff; return *this;  }
operator +(difference_type i_diff) const351*11c03c6dSDamjan Jovanovic     iterator            operator+(
352*11c03c6dSDamjan Jovanovic                             difference_type     i_diff ) const
353*11c03c6dSDamjan Jovanovic                             { iterator ret(itImpl);
354*11c03c6dSDamjan Jovanovic                               return ret += i_diff; }
operator -=(difference_type i_diff)355*11c03c6dSDamjan Jovanovic     iterator &          operator-=(
356*11c03c6dSDamjan Jovanovic                             difference_type     i_diff )
357*11c03c6dSDamjan Jovanovic                             { itImpl -= i_diff; return *this;  }
operator -(difference_type i_diff) const358*11c03c6dSDamjan Jovanovic     iterator            operator-(
359*11c03c6dSDamjan Jovanovic                             difference_type     i_diff ) const
360*11c03c6dSDamjan Jovanovic                             { iterator ret(itImpl);
361*11c03c6dSDamjan Jovanovic                               return ret -= i_diff; }
operator -(iterator i_it) const362*11c03c6dSDamjan Jovanovic     difference_type     operator-(
363*11c03c6dSDamjan Jovanovic                             iterator            i_it ) const
364*11c03c6dSDamjan Jovanovic                             { return itImpl - i_it.itImpl; }
operator [](difference_type i_index)365*11c03c6dSDamjan Jovanovic     XX &                operator[](
366*11c03c6dSDamjan Jovanovic                             difference_type     i_index )
367*11c03c6dSDamjan Jovanovic                             { return *(*itImpl[i_index]); }
368*11c03c6dSDamjan Jovanovic 
369*11c03c6dSDamjan Jovanovic     //////////////////////////////////////////////////////////////////////////
370*11c03c6dSDamjan Jovanovic 
371*11c03c6dSDamjan Jovanovic   private:
372*11c03c6dSDamjan Jovanovic     friend class VirtualVector<XX,PTRDEL>;
ImplValue() const373*11c03c6dSDamjan Jovanovic     impl_iterator       ImplValue() const       { return itImpl; }
374*11c03c6dSDamjan Jovanovic 
375*11c03c6dSDamjan Jovanovic     // DATA
376*11c03c6dSDamjan Jovanovic     impl_iterator       itImpl;
377*11c03c6dSDamjan Jovanovic };
378*11c03c6dSDamjan Jovanovic 
379*11c03c6dSDamjan Jovanovic 
380*11c03c6dSDamjan Jovanovic 
381*11c03c6dSDamjan Jovanovic 
382*11c03c6dSDamjan Jovanovic // IMPLEMENTATION
383*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
384*11c03c6dSDamjan Jovanovic inline
VirtualVector()385*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::VirtualVector()
386*11c03c6dSDamjan Jovanovic     :   aData()
387*11c03c6dSDamjan Jovanovic {
388*11c03c6dSDamjan Jovanovic }
389*11c03c6dSDamjan Jovanovic 
390*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
391*11c03c6dSDamjan Jovanovic inline
VirtualVector(int i_size)392*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::VirtualVector(int i_size)
393*11c03c6dSDamjan Jovanovic     :   aData(i_size, 0)
394*11c03c6dSDamjan Jovanovic {
395*11c03c6dSDamjan Jovanovic }
396*11c03c6dSDamjan Jovanovic 
397*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
398*11c03c6dSDamjan Jovanovic inline
~VirtualVector()399*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::~VirtualVector()
400*11c03c6dSDamjan Jovanovic {
401*11c03c6dSDamjan Jovanovic     PTRDEL::Destruct(aData);
402*11c03c6dSDamjan Jovanovic }
403*11c03c6dSDamjan Jovanovic 
404*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
405*11c03c6dSDamjan Jovanovic inline const XX &
operator [](size_type i_pos) const406*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::operator[]( size_type i_pos ) const
407*11c03c6dSDamjan Jovanovic {
408*11c03c6dSDamjan Jovanovic     return *aData[i_pos];
409*11c03c6dSDamjan Jovanovic }
410*11c03c6dSDamjan Jovanovic 
411*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
412*11c03c6dSDamjan Jovanovic inline XX &
operator [](size_type i_pos)413*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::operator[]( size_type i_pos )
414*11c03c6dSDamjan Jovanovic {
415*11c03c6dSDamjan Jovanovic     return *aData[i_pos];
416*11c03c6dSDamjan Jovanovic }
417*11c03c6dSDamjan Jovanovic 
418*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
419*11c03c6dSDamjan Jovanovic inline void
push_back(DYN XX & i_drElement)420*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::push_back( DYN XX & i_drElement )
421*11c03c6dSDamjan Jovanovic {
422*11c03c6dSDamjan Jovanovic     aData.push_back(&i_drElement);
423*11c03c6dSDamjan Jovanovic }
424*11c03c6dSDamjan Jovanovic 
425*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
426*11c03c6dSDamjan Jovanovic inline void
pop_back()427*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::pop_back()
428*11c03c6dSDamjan Jovanovic {
429*11c03c6dSDamjan Jovanovic     if (NOT aData.empty())
430*11c03c6dSDamjan Jovanovic         PTRDEL::PopBack(aData);
431*11c03c6dSDamjan Jovanovic }
432*11c03c6dSDamjan Jovanovic 
433*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
434*11c03c6dSDamjan Jovanovic inline typename VirtualVector<XX,PTRDEL>::iterator
insert(iterator i_pos,DYN XX & i_drElement)435*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::insert( iterator            i_pos,
436*11c03c6dSDamjan Jovanovic                                   DYN XX &            i_drElement )
437*11c03c6dSDamjan Jovanovic {
438*11c03c6dSDamjan Jovanovic     return iterator(aData.insert(i_pos.ImplValue(), &i_drElement));
439*11c03c6dSDamjan Jovanovic }
440*11c03c6dSDamjan Jovanovic 
441*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
442*11c03c6dSDamjan Jovanovic inline void
erase(iterator i_pos)443*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::erase( iterator i_pos )
444*11c03c6dSDamjan Jovanovic {
445*11c03c6dSDamjan Jovanovic     PTRDEL::Erase(aData, i_pos.ImplValue());
446*11c03c6dSDamjan Jovanovic }
447*11c03c6dSDamjan Jovanovic 
448*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
449*11c03c6dSDamjan Jovanovic inline void
replace(iterator i_pos,DYN XX & i_drElement)450*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::replace( iterator     i_pos,
451*11c03c6dSDamjan Jovanovic                                    DYN XX &     i_drElement )
452*11c03c6dSDamjan Jovanovic {
453*11c03c6dSDamjan Jovanovic     PTRDEL::ReplacePtr(*i_pos, &i_drElement);
454*11c03c6dSDamjan Jovanovic }
455*11c03c6dSDamjan Jovanovic 
456*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
457*11c03c6dSDamjan Jovanovic inline void
reserve(size_type i_size)458*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::reserve( size_type i_size )
459*11c03c6dSDamjan Jovanovic {
460*11c03c6dSDamjan Jovanovic     aData.reserve(i_size);
461*11c03c6dSDamjan Jovanovic }
462*11c03c6dSDamjan Jovanovic 
463*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
464*11c03c6dSDamjan Jovanovic inline bool
empty() const465*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::empty() const
466*11c03c6dSDamjan Jovanovic {
467*11c03c6dSDamjan Jovanovic     return aData.empty();
468*11c03c6dSDamjan Jovanovic }
469*11c03c6dSDamjan Jovanovic 
470*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
471*11c03c6dSDamjan Jovanovic inline size_t
size() const472*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::size() const
473*11c03c6dSDamjan Jovanovic {
474*11c03c6dSDamjan Jovanovic     return aData.size();
475*11c03c6dSDamjan Jovanovic }
476*11c03c6dSDamjan Jovanovic 
477*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
478*11c03c6dSDamjan Jovanovic inline typename VirtualVector<XX,PTRDEL>::const_iterator
begin() const479*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::begin() const
480*11c03c6dSDamjan Jovanovic {
481*11c03c6dSDamjan Jovanovic     return const_iterator(aData.begin());
482*11c03c6dSDamjan Jovanovic }
483*11c03c6dSDamjan Jovanovic 
484*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
485*11c03c6dSDamjan Jovanovic inline typename VirtualVector<XX,PTRDEL>::const_iterator
end() const486*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::end() const
487*11c03c6dSDamjan Jovanovic {
488*11c03c6dSDamjan Jovanovic     return const_iterator(aData.end());
489*11c03c6dSDamjan Jovanovic }
490*11c03c6dSDamjan Jovanovic 
491*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
492*11c03c6dSDamjan Jovanovic inline const XX &
front() const493*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::front() const
494*11c03c6dSDamjan Jovanovic {
495*11c03c6dSDamjan Jovanovic     return *aData.front();
496*11c03c6dSDamjan Jovanovic }
497*11c03c6dSDamjan Jovanovic 
498*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
499*11c03c6dSDamjan Jovanovic inline const XX &
back() const500*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::back() const
501*11c03c6dSDamjan Jovanovic {
502*11c03c6dSDamjan Jovanovic     return *aData.back();
503*11c03c6dSDamjan Jovanovic }
504*11c03c6dSDamjan Jovanovic 
505*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
506*11c03c6dSDamjan Jovanovic inline typename VirtualVector<XX,PTRDEL>::iterator
begin()507*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::begin()
508*11c03c6dSDamjan Jovanovic {
509*11c03c6dSDamjan Jovanovic     return iterator(aData.begin());
510*11c03c6dSDamjan Jovanovic }
511*11c03c6dSDamjan Jovanovic 
512*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
513*11c03c6dSDamjan Jovanovic inline typename VirtualVector<XX,PTRDEL>::iterator
end()514*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::end()
515*11c03c6dSDamjan Jovanovic {
516*11c03c6dSDamjan Jovanovic     return iterator(aData.end());
517*11c03c6dSDamjan Jovanovic }
518*11c03c6dSDamjan Jovanovic 
519*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
520*11c03c6dSDamjan Jovanovic inline XX &
front()521*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::front()
522*11c03c6dSDamjan Jovanovic {
523*11c03c6dSDamjan Jovanovic     return *aData.front();
524*11c03c6dSDamjan Jovanovic }
525*11c03c6dSDamjan Jovanovic 
526*11c03c6dSDamjan Jovanovic template <class XX, class PTRDEL>
527*11c03c6dSDamjan Jovanovic inline XX &
back()528*11c03c6dSDamjan Jovanovic VirtualVector<XX,PTRDEL>::back()
529*11c03c6dSDamjan Jovanovic {
530*11c03c6dSDamjan Jovanovic     return *aData.back();
531*11c03c6dSDamjan Jovanovic }
532*11c03c6dSDamjan Jovanovic 
533*11c03c6dSDamjan Jovanovic 
534*11c03c6dSDamjan Jovanovic 
535*11c03c6dSDamjan Jovanovic 
536*11c03c6dSDamjan Jovanovic }   // namespace csv
537*11c03c6dSDamjan Jovanovic #endif
538