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