1*8a106958SDamjan Jovanovic /**************************************************************
2*8a106958SDamjan Jovanovic *
3*8a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one
4*8a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file
5*8a106958SDamjan Jovanovic * distributed with this work for additional information
6*8a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file
7*8a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the
8*8a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance
9*8a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at
10*8a106958SDamjan Jovanovic *
11*8a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0
12*8a106958SDamjan Jovanovic *
13*8a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing,
14*8a106958SDamjan Jovanovic * software distributed under the License is distributed on an
15*8a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*8a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the
17*8a106958SDamjan Jovanovic * specific language governing permissions and limitations
18*8a106958SDamjan Jovanovic * under the License.
19*8a106958SDamjan Jovanovic *
20*8a106958SDamjan Jovanovic *************************************************************/
21*8a106958SDamjan Jovanovic
22*8a106958SDamjan Jovanovic
23*8a106958SDamjan Jovanovic
24*8a106958SDamjan Jovanovic #ifndef CSV_DYN_HXX
25*8a106958SDamjan Jovanovic #define CSV_DYN_HXX
26*8a106958SDamjan Jovanovic
27*8a106958SDamjan Jovanovic
28*8a106958SDamjan Jovanovic
29*8a106958SDamjan Jovanovic
30*8a106958SDamjan Jovanovic namespace csv
31*8a106958SDamjan Jovanovic {
32*8a106958SDamjan Jovanovic
33*8a106958SDamjan Jovanovic
34*8a106958SDamjan Jovanovic /** Dyn owns an object on the heap, which will be automatically
35*8a106958SDamjan Jovanovic deleted in its D'tor.
36*8a106958SDamjan Jovanovic
37*8a106958SDamjan Jovanovic Dyn's main purpose is for class members on the heap:
38*8a106958SDamjan Jovanovic You can't forget to delete them in the D'tor. Constness will be transferred
39*8a106958SDamjan Jovanovic to the hold object.
40*8a106958SDamjan Jovanovic
41*8a106958SDamjan Jovanovic Dyn forbids the CopyC'tor and operator=(). So you can't incidentally
42*8a106958SDamjan Jovanovic run into problems with compiler defined CopyC'tor or operator=() of the
43*8a106958SDamjan Jovanovic owning class. If you need those, you have to define them explicitly - as
44*8a106958SDamjan Jovanovic you should do anyway with all classes, that own members on the heap.
45*8a106958SDamjan Jovanovic
46*8a106958SDamjan Jovanovic Dyn also works with incomplete types.
47*8a106958SDamjan Jovanovic You only need to write
48*8a106958SDamjan Jovanovic class DX;
49*8a106958SDamjan Jovanovic but needn't include #include <DX>.hxx.
50*8a106958SDamjan Jovanovic This is a difference to std::auto_ptr, where it is not absolutely clear
51*8a106958SDamjan Jovanovic if it is allowed to use it with incomplete types.
52*8a106958SDamjan Jovanovic
53*8a106958SDamjan Jovanovic You can also use Dyn within function bodies, to make them exception safe.
54*8a106958SDamjan Jovanovic
55*8a106958SDamjan Jovanovic @attention
56*8a106958SDamjan Jovanovic If you use Dyn with an incomplete type, the owning class needs to
57*8a106958SDamjan Jovanovic define a non-inline D'tor. Else the compiler will complain.
58*8a106958SDamjan Jovanovic */
59*8a106958SDamjan Jovanovic template <class DX>
60*8a106958SDamjan Jovanovic class Dyn
61*8a106958SDamjan Jovanovic {
62*8a106958SDamjan Jovanovic public:
63*8a106958SDamjan Jovanovic // LIFECYCLE
64*8a106958SDamjan Jovanovic /// From now on, let_dpObject is owned by this Dyn-object.
65*8a106958SDamjan Jovanovic explicit Dyn(
66*8a106958SDamjan Jovanovic DX * let_dpObject = 0);
67*8a106958SDamjan Jovanovic ~Dyn();
68*8a106958SDamjan Jovanovic // OPERATORS
69*8a106958SDamjan Jovanovic /** This deletes a prevoiusly existing dpObject!
70*8a106958SDamjan Jovanovic From now on, let_dpObject is owned by this Dyn-object.
71*8a106958SDamjan Jovanovic */
72*8a106958SDamjan Jovanovic Dyn<DX> & operator=(
73*8a106958SDamjan Jovanovic DX * let_dpObject);
74*8a106958SDamjan Jovanovic /// @return true, if any valid object is hold, false else.
75*8a106958SDamjan Jovanovic operator bool() const;
76*8a106958SDamjan Jovanovic
77*8a106958SDamjan Jovanovic const DX * operator->() const;
78*8a106958SDamjan Jovanovic DX * operator->();
79*8a106958SDamjan Jovanovic
80*8a106958SDamjan Jovanovic const DX & operator*() const;
81*8a106958SDamjan Jovanovic DX & operator*();
82*8a106958SDamjan Jovanovic
83*8a106958SDamjan Jovanovic // OPERATIONS
84*8a106958SDamjan Jovanovic /** @return The hold object on the heap.
85*8a106958SDamjan Jovanovic
86*8a106958SDamjan Jovanovic @ATTENTION
87*8a106958SDamjan Jovanovic The caller of the function is responsible to delete
88*8a106958SDamjan Jovanovic the returned object
89*8a106958SDamjan Jovanovic
90*8a106958SDamjan Jovanovic @postcond
91*8a106958SDamjan Jovanovic this->dpObject == 0.
92*8a106958SDamjan Jovanovic */
93*8a106958SDamjan Jovanovic DX * Release();
94*8a106958SDamjan Jovanovic
95*8a106958SDamjan Jovanovic // INQUIRY
96*8a106958SDamjan Jovanovic /// Shorthand for operator->(), if implicit overloading of -> can not be used.
97*8a106958SDamjan Jovanovic const DX * Ptr() const;
98*8a106958SDamjan Jovanovic
99*8a106958SDamjan Jovanovic // ACCESS
100*8a106958SDamjan Jovanovic /// Shorthand for operator->(), if implicit overloading of -> can not be used.
101*8a106958SDamjan Jovanovic DX * Ptr();
102*8a106958SDamjan Jovanovic /// So const objects can return mutable pointers to the owned object.
103*8a106958SDamjan Jovanovic DX * MutablePtr() const;
104*8a106958SDamjan Jovanovic
105*8a106958SDamjan Jovanovic private:
106*8a106958SDamjan Jovanovic /* Does NOT set dpObject to zero! Because it is only used
107*8a106958SDamjan Jovanovic internally in situations where dpObject is set immediately
108*8a106958SDamjan Jovanovic after.
109*8a106958SDamjan Jovanovic */
110*8a106958SDamjan Jovanovic void Delete();
111*8a106958SDamjan Jovanovic
112*8a106958SDamjan Jovanovic /** Forbidden function!
113*8a106958SDamjan Jovanovic -------------------
114*8a106958SDamjan Jovanovic Help ensure, that classes with
115*8a106958SDamjan Jovanovic dynamic pointers use a selfdefined copy constructor
116*8a106958SDamjan Jovanovic and operator=(). If the default versions of these
117*8a106958SDamjan Jovanovic functions are used, the compiler will throw an error.
118*8a106958SDamjan Jovanovic **/
119*8a106958SDamjan Jovanovic Dyn( const Dyn<DX> & );
120*8a106958SDamjan Jovanovic /** Forbidden function!
121*8a106958SDamjan Jovanovic -------------------
122*8a106958SDamjan Jovanovic Help ensure, that classes with
123*8a106958SDamjan Jovanovic dynamic pointers use a selfdefined copy constructor
124*8a106958SDamjan Jovanovic and operator=(). If the default versions of these
125*8a106958SDamjan Jovanovic functions are used, the compiler will throw an error.
126*8a106958SDamjan Jovanovic **/
127*8a106958SDamjan Jovanovic Dyn<DX> & operator=( const Dyn<DX> & );
128*8a106958SDamjan Jovanovic
129*8a106958SDamjan Jovanovic // DATA
130*8a106958SDamjan Jovanovic /// An owned heap object. Needs to be deleted by this class.
131*8a106958SDamjan Jovanovic DX * dpObject;
132*8a106958SDamjan Jovanovic };
133*8a106958SDamjan Jovanovic
134*8a106958SDamjan Jovanovic
135*8a106958SDamjan Jovanovic
136*8a106958SDamjan Jovanovic
137*8a106958SDamjan Jovanovic // IMPLEMENTATION
138*8a106958SDamjan Jovanovic template <class DX>
139*8a106958SDamjan Jovanovic void
Delete()140*8a106958SDamjan Jovanovic Dyn<DX>::Delete()
141*8a106958SDamjan Jovanovic {
142*8a106958SDamjan Jovanovic if (dpObject != 0)
143*8a106958SDamjan Jovanovic delete dpObject;
144*8a106958SDamjan Jovanovic }
145*8a106958SDamjan Jovanovic
146*8a106958SDamjan Jovanovic template <class DX>
147*8a106958SDamjan Jovanovic inline
Dyn(DX * let_dpObject)148*8a106958SDamjan Jovanovic Dyn<DX>::Dyn( DX * let_dpObject )
149*8a106958SDamjan Jovanovic : dpObject(let_dpObject) {}
150*8a106958SDamjan Jovanovic
151*8a106958SDamjan Jovanovic template <class DX>
152*8a106958SDamjan Jovanovic inline
~Dyn()153*8a106958SDamjan Jovanovic Dyn<DX>::~Dyn()
154*8a106958SDamjan Jovanovic { Delete(); }
155*8a106958SDamjan Jovanovic
156*8a106958SDamjan Jovanovic
157*8a106958SDamjan Jovanovic template <class DX>
158*8a106958SDamjan Jovanovic inline Dyn<DX> &
operator =(DX * let_dpObject)159*8a106958SDamjan Jovanovic Dyn<DX>::operator=( DX * let_dpObject )
160*8a106958SDamjan Jovanovic {
161*8a106958SDamjan Jovanovic if ( dpObject == let_dpObject )
162*8a106958SDamjan Jovanovic return *this;
163*8a106958SDamjan Jovanovic
164*8a106958SDamjan Jovanovic Delete();
165*8a106958SDamjan Jovanovic dpObject = let_dpObject;
166*8a106958SDamjan Jovanovic return *this;
167*8a106958SDamjan Jovanovic }
168*8a106958SDamjan Jovanovic
169*8a106958SDamjan Jovanovic template <class DX>
170*8a106958SDamjan Jovanovic inline
operator bool() const171*8a106958SDamjan Jovanovic Dyn<DX>::operator bool() const
172*8a106958SDamjan Jovanovic { return dpObject != 0; }
173*8a106958SDamjan Jovanovic
174*8a106958SDamjan Jovanovic template <class DX>
175*8a106958SDamjan Jovanovic inline
176*8a106958SDamjan Jovanovic const DX *
operator ->() const177*8a106958SDamjan Jovanovic Dyn<DX>::operator->() const
178*8a106958SDamjan Jovanovic { return dpObject; }
179*8a106958SDamjan Jovanovic
180*8a106958SDamjan Jovanovic template <class DX>
181*8a106958SDamjan Jovanovic inline DX *
operator ->()182*8a106958SDamjan Jovanovic Dyn<DX>::operator->()
183*8a106958SDamjan Jovanovic { return dpObject; }
184*8a106958SDamjan Jovanovic
185*8a106958SDamjan Jovanovic template <class DX>
186*8a106958SDamjan Jovanovic inline const DX &
operator *() const187*8a106958SDamjan Jovanovic Dyn<DX>::operator*() const
188*8a106958SDamjan Jovanovic { csv_assert(dpObject != 0);
189*8a106958SDamjan Jovanovic return *dpObject;
190*8a106958SDamjan Jovanovic }
191*8a106958SDamjan Jovanovic
192*8a106958SDamjan Jovanovic template <class DX>
193*8a106958SDamjan Jovanovic inline DX &
operator *()194*8a106958SDamjan Jovanovic Dyn<DX>::operator*()
195*8a106958SDamjan Jovanovic { csv_assert(dpObject != 0);
196*8a106958SDamjan Jovanovic return *dpObject;
197*8a106958SDamjan Jovanovic }
198*8a106958SDamjan Jovanovic
199*8a106958SDamjan Jovanovic template <class DX>
200*8a106958SDamjan Jovanovic inline DX *
Release()201*8a106958SDamjan Jovanovic Dyn<DX>::Release()
202*8a106958SDamjan Jovanovic { DX * ret = dpObject;
203*8a106958SDamjan Jovanovic dpObject = 0;
204*8a106958SDamjan Jovanovic return ret;
205*8a106958SDamjan Jovanovic }
206*8a106958SDamjan Jovanovic
207*8a106958SDamjan Jovanovic template <class DX>
208*8a106958SDamjan Jovanovic inline const DX *
Ptr() const209*8a106958SDamjan Jovanovic Dyn<DX>::Ptr() const
210*8a106958SDamjan Jovanovic { return dpObject; }
211*8a106958SDamjan Jovanovic
212*8a106958SDamjan Jovanovic template <class DX>
213*8a106958SDamjan Jovanovic inline DX *
Ptr()214*8a106958SDamjan Jovanovic Dyn<DX>::Ptr()
215*8a106958SDamjan Jovanovic { return dpObject; }
216*8a106958SDamjan Jovanovic
217*8a106958SDamjan Jovanovic template <class DX>
218*8a106958SDamjan Jovanovic inline DX *
MutablePtr() const219*8a106958SDamjan Jovanovic Dyn<DX>::MutablePtr() const
220*8a106958SDamjan Jovanovic { return dpObject; }
221*8a106958SDamjan Jovanovic
222*8a106958SDamjan Jovanovic } // namespace csv
223*8a106958SDamjan Jovanovic
224*8a106958SDamjan Jovanovic
225*8a106958SDamjan Jovanovic
226*8a106958SDamjan Jovanovic
227*8a106958SDamjan Jovanovic #ifndef CSV_HIDE_DYN
228*8a106958SDamjan Jovanovic #define Dyn ::csv::Dyn
229*8a106958SDamjan Jovanovic #endif
230*8a106958SDamjan Jovanovic
231*8a106958SDamjan Jovanovic
232*8a106958SDamjan Jovanovic
233*8a106958SDamjan Jovanovic
234*8a106958SDamjan Jovanovic #endif
235