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