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