xref: /AOO42X/main/autodoc/inc/cosv/tpl/dyn.hxx (revision 9bce9b0d387299c68bd81d539e1478357a103de5)
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