Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / memory / tmp / tmpI.H
blob540db73bc30719aef1f0d2b3534e5fc88965e082
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "error.H"
28 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
30 template<class T>
31 inline Foam::tmp<T>::tmp(T* tPtr)
33     isTmp_(true),
34     ptr_(tPtr),
35     ref_(*tPtr)
39 template<class T>
40 inline Foam::tmp<T>::tmp(const T& tRef)
42     isTmp_(false),
43     ptr_(0),
44     ref_(tRef)
48 template<class T>
49 inline Foam::tmp<T>::tmp(const tmp<T>& t)
51     isTmp_(t.isTmp_),
52     ptr_(t.ptr_),
53     ref_(t.ref_)
55     if (isTmp_)
56     {
57         if (ptr_)
58         {
59             ptr_->operator++();
60         }
61         else
62         {
63             FatalErrorIn("tmp<T>::tmp(const tmp<T>&)")
64                 << "attempted copy of a deallocated temporary"
65                 << abort(FatalError);
66         }
67     }
71 template<class T>
72 inline Foam::tmp<T>::~tmp()
74     if (isTmp_ && ptr_)
75     {
76         if (ptr_->okToDelete())
77         {
78             delete ptr_;
79             ptr_ = 0;
80         }
81         else
82         {
83             ptr_->operator--();
84         }
85     }
89 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
91 template<class T>
92 inline bool Foam::tmp<T>::isTmp() const
94     return isTmp_;
98 template<class T>
99 inline bool Foam::tmp<T>::empty() const
101     return (isTmp_ && !ptr_);
105 template<class T>
106 inline bool Foam::tmp<T>::valid() const
108     return (!isTmp_ || (isTmp_ && ptr_));
112 template<class T>
113 inline T* Foam::tmp<T>::ptr() const
115     if (isTmp_)
116     {
117          if (!ptr_)
118          {
119              FatalErrorIn("tmp<T>::ptr() const")
120                  << "temporary deallocated"
121                  << abort(FatalError);
122          }
124          T* ptr = ptr_;
125          ptr_ = 0;
127          ptr->resetRefCount();
129          return ptr;
130     }
131     else
132     {
133         return new T(ref_);
134     }
138 template<class T>
139 inline void Foam::tmp<T>::clear() const
141     if (isTmp_ && ptr_)  // skip this bit:  && ptr_->okToDelete())
142     {
143         delete ptr_;
144         ptr_ = 0;
145     }
149 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
151 template<class T>
152 inline T& Foam::tmp<T>::operator()()
154     if (isTmp_)
155     {
156         if (!ptr_)
157         {
158             FatalErrorIn("T& tmp<T>::operator()()")
159                 << "temporary deallocated"
160                 << abort(FatalError);
161         }
163         return *ptr_;
164     }
165     else
166     {
167         // Note: const is cast away!
168         // Perhaps there should be two refs, one for const and one for non const
169         // and if the ref is actually const then you cannot return it here.
170         //
171         // Another possibility would be to store a const ref and a flag to say
172         // whether the tmp was constructed with a const or a non-const argument.
173         //
174         // eg, enum refType { POINTER = 0, REF = 1, CONSTREF = 2 };
175         return const_cast<T&>(ref_);
176     }
180 template<class T>
181 inline const T& Foam::tmp<T>::operator()() const
183     if (isTmp_)
184     {
185         if (!ptr_)
186         {
187             FatalErrorIn("const T& tmp<T>::operator()() const")
188                 << "temporary deallocated"
189                 << abort(FatalError);
190         }
192         return *ptr_;
193     }
194     else
195     {
196         return ref_;
197     }
201 template<class T>
202 inline Foam::tmp<T>::operator const T&() const
204     return operator()();
208 template<class T>
209 inline T* Foam::tmp<T>::operator->()
211     if (isTmp_)
212     {
213          if (!ptr_)
214          {
215              FatalErrorIn("tmp<T>::operator->()")
216                  << "temporary deallocated"
217                  << abort(FatalError);
218          }
220          return ptr_;
221     }
222     else
223     {
224         return &const_cast<T&>(ref_);
225     }
229 template<class T>
230 inline const T* Foam::tmp<T>::operator->() const
232     return const_cast<tmp<T>&>(*this).operator->();
236 template<class T>
237 inline void Foam::tmp<T>::operator=(const tmp<T>& t)
239     if (isTmp_ && ptr_)
240     {
241         if (ptr_->okToDelete())
242         {
243             delete ptr_;
244             ptr_ = 0;
245         }
246         else
247         {
248             ptr_->operator--();
249         }
250     }
252     if (t.isTmp_)
253     {
254         isTmp_ = true;
255         ptr_ = t.ptr_;
257         if (ptr_)
258         {
259             ptr_->operator++();
260         }
261         else
262         {
263             FatalErrorIn("tmp<T>::operator=(const tmp<T>& t)")
264                 << "attempted copy of a deallocated temporary"
265                 << abort(FatalError);
266         }
267     }
268     else
269     {
270         FatalErrorIn("tmp<T>::operator=(const tmp<T>& t)")
271             << "attempted to assign to a const reference to constant object"
272             << abort(FatalError);
273     }
277 // ************************************************************************* //