1*35238bceSAndroid Build Coastguard Worker #ifndef _DESHAREDPTR_HPP
2*35238bceSAndroid Build Coastguard Worker #define _DESHAREDPTR_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements C++ Base Library
5*35238bceSAndroid Build Coastguard Worker * -----------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Shared pointer.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "deDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deAtomic.h"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker #include <exception>
30*35238bceSAndroid Build Coastguard Worker #include <algorithm>
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker namespace de
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker //! Shared pointer self-test.
36*35238bceSAndroid Build Coastguard Worker void SharedPtr_selfTest(void);
37*35238bceSAndroid Build Coastguard Worker
38*35238bceSAndroid Build Coastguard Worker class DeadReferenceException : public std::exception
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker public:
DeadReferenceException(void)41*35238bceSAndroid Build Coastguard Worker DeadReferenceException(void) throw() : std::exception()
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker }
44*35238bceSAndroid Build Coastguard Worker
what(void) const45*35238bceSAndroid Build Coastguard Worker const char *what(void) const throw()
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker return "DeadReferenceException";
48*35238bceSAndroid Build Coastguard Worker }
49*35238bceSAndroid Build Coastguard Worker };
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker struct SharedPtrStateBase
52*35238bceSAndroid Build Coastguard Worker {
SharedPtrStateBasede::SharedPtrStateBase53*35238bceSAndroid Build Coastguard Worker SharedPtrStateBase(void) : strongRefCount(0), weakRefCount(0)
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker
~SharedPtrStateBasede::SharedPtrStateBase57*35238bceSAndroid Build Coastguard Worker virtual ~SharedPtrStateBase(void) throw()
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker }
60*35238bceSAndroid Build Coastguard Worker virtual void deletePtr(void) throw() = 0;
61*35238bceSAndroid Build Coastguard Worker
62*35238bceSAndroid Build Coastguard Worker volatile int32_t strongRefCount;
63*35238bceSAndroid Build Coastguard Worker volatile int32_t weakRefCount; //!< WeakPtr references + StrongPtr references.
64*35238bceSAndroid Build Coastguard Worker };
65*35238bceSAndroid Build Coastguard Worker
66*35238bceSAndroid Build Coastguard Worker template <typename Type, typename Deleter>
67*35238bceSAndroid Build Coastguard Worker struct SharedPtrState : public SharedPtrStateBase
68*35238bceSAndroid Build Coastguard Worker {
SharedPtrStatede::SharedPtrState69*35238bceSAndroid Build Coastguard Worker SharedPtrState(Type *ptr, Deleter deleter) : m_ptr(ptr), m_deleter(deleter)
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker
~SharedPtrStatede::SharedPtrState73*35238bceSAndroid Build Coastguard Worker virtual ~SharedPtrState(void) throw()
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_ptr);
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker
deletePtrde::SharedPtrState78*35238bceSAndroid Build Coastguard Worker virtual void deletePtr(void) throw()
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker m_deleter(m_ptr);
81*35238bceSAndroid Build Coastguard Worker m_ptr = DE_NULL;
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker private:
85*35238bceSAndroid Build Coastguard Worker Type *m_ptr;
86*35238bceSAndroid Build Coastguard Worker Deleter m_deleter;
87*35238bceSAndroid Build Coastguard Worker };
88*35238bceSAndroid Build Coastguard Worker
89*35238bceSAndroid Build Coastguard Worker template <typename T>
90*35238bceSAndroid Build Coastguard Worker class SharedPtr;
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker template <typename T>
93*35238bceSAndroid Build Coastguard Worker class WeakPtr;
94*35238bceSAndroid Build Coastguard Worker
95*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
96*35238bceSAndroid Build Coastguard Worker * \brief Shared pointer
97*35238bceSAndroid Build Coastguard Worker *
98*35238bceSAndroid Build Coastguard Worker * SharedPtr is smart pointer for managing shared ownership to a pointer.
99*35238bceSAndroid Build Coastguard Worker * Multiple SharedPtrs can maintain ownership to the pointer and it is
100*35238bceSAndroid Build Coastguard Worker * destructed when last SharedPtr is destroyed.
101*35238bceSAndroid Build Coastguard Worker *
102*35238bceSAndroid Build Coastguard Worker * SharedPtr can also be NULL.
103*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
104*35238bceSAndroid Build Coastguard Worker template <typename T>
105*35238bceSAndroid Build Coastguard Worker class SharedPtr
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker public:
108*35238bceSAndroid Build Coastguard Worker SharedPtr(void);
109*35238bceSAndroid Build Coastguard Worker SharedPtr(const SharedPtr<T> &other);
110*35238bceSAndroid Build Coastguard Worker explicit SharedPtr(T *ptr);
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker template <typename Deleter>
113*35238bceSAndroid Build Coastguard Worker SharedPtr(T *ptr, Deleter deleter);
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker template <typename Y>
116*35238bceSAndroid Build Coastguard Worker explicit SharedPtr(const SharedPtr<Y> &other);
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker template <typename Y>
119*35238bceSAndroid Build Coastguard Worker explicit SharedPtr(const WeakPtr<Y> &other);
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Worker ~SharedPtr(void);
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker template <typename Y>
124*35238bceSAndroid Build Coastguard Worker SharedPtr &operator=(const SharedPtr<Y> &other);
125*35238bceSAndroid Build Coastguard Worker SharedPtr &operator=(const SharedPtr<T> &other);
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker template <typename Y>
128*35238bceSAndroid Build Coastguard Worker SharedPtr &operator=(const WeakPtr<Y> &other);
129*35238bceSAndroid Build Coastguard Worker
get(void) const130*35238bceSAndroid Build Coastguard Worker T *get(void) const throw()
131*35238bceSAndroid Build Coastguard Worker {
132*35238bceSAndroid Build Coastguard Worker return m_ptr;
133*35238bceSAndroid Build Coastguard Worker } //!< Get stored pointer.
operator ->(void) const134*35238bceSAndroid Build Coastguard Worker T *operator->(void) const throw()
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker return m_ptr;
137*35238bceSAndroid Build Coastguard Worker } //!< Get stored pointer.
operator *(void) const138*35238bceSAndroid Build Coastguard Worker T &operator*(void) const throw()
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker return *m_ptr;
141*35238bceSAndroid Build Coastguard Worker } //!< De-reference pointer.
142*35238bceSAndroid Build Coastguard Worker
operator bool(void) const143*35238bceSAndroid Build Coastguard Worker operator bool(void) const throw()
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker return !!m_ptr;
146*35238bceSAndroid Build Coastguard Worker }
147*35238bceSAndroid Build Coastguard Worker
148*35238bceSAndroid Build Coastguard Worker void swap(SharedPtr<T> &other);
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker void clear(void);
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker template <typename Y>
153*35238bceSAndroid Build Coastguard Worker operator SharedPtr<Y>(void) const;
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Worker private:
156*35238bceSAndroid Build Coastguard Worker void acquire(void);
157*35238bceSAndroid Build Coastguard Worker void acquireFromWeak(const WeakPtr<T> &other);
158*35238bceSAndroid Build Coastguard Worker void release(void);
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker T *m_ptr;
161*35238bceSAndroid Build Coastguard Worker SharedPtrStateBase *m_state;
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker friend class WeakPtr<T>;
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker template <typename U>
166*35238bceSAndroid Build Coastguard Worker friend class SharedPtr;
167*35238bceSAndroid Build Coastguard Worker };
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
170*35238bceSAndroid Build Coastguard Worker * \brief Weak pointer
171*35238bceSAndroid Build Coastguard Worker *
172*35238bceSAndroid Build Coastguard Worker * WeakPtr manages weak references to objects owned by SharedPtr. Shared
173*35238bceSAndroid Build Coastguard Worker * pointer can be converted to weak pointer and vice versa. Weak pointer
174*35238bceSAndroid Build Coastguard Worker * differs from SharedPtr by not affecting the lifetime of the managed
175*35238bceSAndroid Build Coastguard Worker * object.
176*35238bceSAndroid Build Coastguard Worker *
177*35238bceSAndroid Build Coastguard Worker * WeakPtr can be converted back to SharedPtr but that operation can fail
178*35238bceSAndroid Build Coastguard Worker * if the object is no longer live. In such case DeadReferenceException
179*35238bceSAndroid Build Coastguard Worker * will be thrown.
180*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
181*35238bceSAndroid Build Coastguard Worker template <typename T>
182*35238bceSAndroid Build Coastguard Worker class WeakPtr
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker public:
185*35238bceSAndroid Build Coastguard Worker WeakPtr(void);
186*35238bceSAndroid Build Coastguard Worker WeakPtr(const WeakPtr<T> &other);
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker explicit WeakPtr(const SharedPtr<T> &other);
189*35238bceSAndroid Build Coastguard Worker ~WeakPtr(void);
190*35238bceSAndroid Build Coastguard Worker
191*35238bceSAndroid Build Coastguard Worker WeakPtr &operator=(const WeakPtr<T> &other);
192*35238bceSAndroid Build Coastguard Worker WeakPtr &operator=(const SharedPtr<T> &other);
193*35238bceSAndroid Build Coastguard Worker
194*35238bceSAndroid Build Coastguard Worker SharedPtr<T> lock(void);
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker private:
197*35238bceSAndroid Build Coastguard Worker void acquire(void);
198*35238bceSAndroid Build Coastguard Worker void release(void);
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker T *m_ptr;
201*35238bceSAndroid Build Coastguard Worker SharedPtrStateBase *m_state;
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker friend class SharedPtr<T>;
204*35238bceSAndroid Build Coastguard Worker };
205*35238bceSAndroid Build Coastguard Worker
206*35238bceSAndroid Build Coastguard Worker // SharedPtr template implementation.
207*35238bceSAndroid Build Coastguard Worker
208*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
209*35238bceSAndroid Build Coastguard Worker * \brief Construct empty shared pointer.
210*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
211*35238bceSAndroid Build Coastguard Worker template <typename T>
SharedPtr(void)212*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(void) : m_ptr(DE_NULL)
213*35238bceSAndroid Build Coastguard Worker , m_state(DE_NULL)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker }
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
218*35238bceSAndroid Build Coastguard Worker * \brief Construct shared pointer from pointer.
219*35238bceSAndroid Build Coastguard Worker * \param ptr Pointer to be managed.
220*35238bceSAndroid Build Coastguard Worker *
221*35238bceSAndroid Build Coastguard Worker * Ownership of the pointer will be transferred to SharedPtr and future
222*35238bceSAndroid Build Coastguard Worker * SharedPtr's initialized or assigned from this SharedPtr.
223*35238bceSAndroid Build Coastguard Worker *
224*35238bceSAndroid Build Coastguard Worker * If allocation of shared state fails. The "ptr" argument will not be
225*35238bceSAndroid Build Coastguard Worker * released.
226*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
227*35238bceSAndroid Build Coastguard Worker template <typename T>
SharedPtr(T * ptr)228*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(T *ptr) : m_ptr(DE_NULL)
229*35238bceSAndroid Build Coastguard Worker , m_state(DE_NULL)
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker try
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker m_ptr = ptr;
234*35238bceSAndroid Build Coastguard Worker m_state = new SharedPtrState<T, DefaultDeleter<T>>(ptr, DefaultDeleter<T>());
235*35238bceSAndroid Build Coastguard Worker m_state->strongRefCount = 1;
236*35238bceSAndroid Build Coastguard Worker m_state->weakRefCount = 1;
237*35238bceSAndroid Build Coastguard Worker }
238*35238bceSAndroid Build Coastguard Worker catch (...)
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker // \note ptr is not released.
241*35238bceSAndroid Build Coastguard Worker delete m_state;
242*35238bceSAndroid Build Coastguard Worker throw;
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker }
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
247*35238bceSAndroid Build Coastguard Worker * \brief Construct shared pointer from pointer.
248*35238bceSAndroid Build Coastguard Worker * \param ptr Pointer to be managed.
249*35238bceSAndroid Build Coastguard Worker *
250*35238bceSAndroid Build Coastguard Worker * Ownership of the pointer will be transferred to SharedPtr and future
251*35238bceSAndroid Build Coastguard Worker * SharedPtr's initialized or assigned from this SharedPtr.
252*35238bceSAndroid Build Coastguard Worker *
253*35238bceSAndroid Build Coastguard Worker * Deleter must be callable type and deleter is called with the pointer
254*35238bceSAndroid Build Coastguard Worker * argument when the reference count becomes 0.
255*35238bceSAndroid Build Coastguard Worker *
256*35238bceSAndroid Build Coastguard Worker * If allocation of shared state fails. The "ptr" argument will not be
257*35238bceSAndroid Build Coastguard Worker * released.
258*35238bceSAndroid Build Coastguard Worker *
259*35238bceSAndroid Build Coastguard Worker * Calling deleter or calling destructor for deleter should never throw.
260*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
261*35238bceSAndroid Build Coastguard Worker template <typename T>
262*35238bceSAndroid Build Coastguard Worker template <typename Deleter>
SharedPtr(T * ptr,Deleter deleter)263*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(T *ptr, Deleter deleter) : m_ptr(DE_NULL)
264*35238bceSAndroid Build Coastguard Worker , m_state(DE_NULL)
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker try
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker m_ptr = ptr;
269*35238bceSAndroid Build Coastguard Worker m_state = new SharedPtrState<T, Deleter>(ptr, deleter);
270*35238bceSAndroid Build Coastguard Worker m_state->strongRefCount = 1;
271*35238bceSAndroid Build Coastguard Worker m_state->weakRefCount = 1;
272*35238bceSAndroid Build Coastguard Worker }
273*35238bceSAndroid Build Coastguard Worker catch (...)
274*35238bceSAndroid Build Coastguard Worker {
275*35238bceSAndroid Build Coastguard Worker // \note ptr is not released.
276*35238bceSAndroid Build Coastguard Worker delete m_state;
277*35238bceSAndroid Build Coastguard Worker throw;
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker }
280*35238bceSAndroid Build Coastguard Worker
281*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
282*35238bceSAndroid Build Coastguard Worker * \brief Initialize shared pointer from another SharedPtr.
283*35238bceSAndroid Build Coastguard Worker * \param other Pointer to be shared.
284*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
285*35238bceSAndroid Build Coastguard Worker template <typename T>
SharedPtr(const SharedPtr<T> & other)286*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(const SharedPtr<T> &other) : m_ptr(other.m_ptr)
287*35238bceSAndroid Build Coastguard Worker , m_state(other.m_state)
288*35238bceSAndroid Build Coastguard Worker {
289*35238bceSAndroid Build Coastguard Worker acquire();
290*35238bceSAndroid Build Coastguard Worker }
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
293*35238bceSAndroid Build Coastguard Worker * \brief Initialize shared pointer from another SharedPtr.
294*35238bceSAndroid Build Coastguard Worker * \param other Pointer to be shared.
295*35238bceSAndroid Build Coastguard Worker *
296*35238bceSAndroid Build Coastguard Worker * Y* must be convertible to T*.
297*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
298*35238bceSAndroid Build Coastguard Worker template <typename T>
299*35238bceSAndroid Build Coastguard Worker template <typename Y>
SharedPtr(const SharedPtr<Y> & other)300*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(const SharedPtr<Y> &other) : m_ptr(other.m_ptr)
301*35238bceSAndroid Build Coastguard Worker , m_state(other.m_state)
302*35238bceSAndroid Build Coastguard Worker {
303*35238bceSAndroid Build Coastguard Worker acquire();
304*35238bceSAndroid Build Coastguard Worker }
305*35238bceSAndroid Build Coastguard Worker
306*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
307*35238bceSAndroid Build Coastguard Worker * \brief Initialize shared pointer from weak reference.
308*35238bceSAndroid Build Coastguard Worker * \param other Pointer to be shared.
309*35238bceSAndroid Build Coastguard Worker *
310*35238bceSAndroid Build Coastguard Worker * Y* must be convertible to T*.
311*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
312*35238bceSAndroid Build Coastguard Worker template <typename T>
313*35238bceSAndroid Build Coastguard Worker template <typename Y>
SharedPtr(const WeakPtr<Y> & other)314*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::SharedPtr(const WeakPtr<Y> &other) : m_ptr(DE_NULL)
315*35238bceSAndroid Build Coastguard Worker , m_state(DE_NULL)
316*35238bceSAndroid Build Coastguard Worker {
317*35238bceSAndroid Build Coastguard Worker acquireFromWeak(other);
318*35238bceSAndroid Build Coastguard Worker }
319*35238bceSAndroid Build Coastguard Worker
320*35238bceSAndroid Build Coastguard Worker template <typename T>
~SharedPtr(void)321*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::~SharedPtr(void)
322*35238bceSAndroid Build Coastguard Worker {
323*35238bceSAndroid Build Coastguard Worker release();
324*35238bceSAndroid Build Coastguard Worker }
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
327*35238bceSAndroid Build Coastguard Worker * \brief Assign from other shared pointer.
328*35238bceSAndroid Build Coastguard Worker * \param other Pointer to be shared.
329*35238bceSAndroid Build Coastguard Worker * \return Reference to this SharedPtr.
330*35238bceSAndroid Build Coastguard Worker *
331*35238bceSAndroid Build Coastguard Worker * Reference to current pointer is released and reference to new pointer is
332*35238bceSAndroid Build Coastguard Worker * acquired.
333*35238bceSAndroid Build Coastguard Worker *
334*35238bceSAndroid Build Coastguard Worker * Y* must be convertible to T*.
335*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
336*35238bceSAndroid Build Coastguard Worker template <typename T>
337*35238bceSAndroid Build Coastguard Worker template <typename Y>
operator =(const SharedPtr<Y> & other)338*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T> &SharedPtr<T>::operator=(const SharedPtr<Y> &other)
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker if (m_state == other.m_state)
341*35238bceSAndroid Build Coastguard Worker return *this;
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker // Release current reference.
344*35238bceSAndroid Build Coastguard Worker release();
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker // Copy from other and acquire reference.
347*35238bceSAndroid Build Coastguard Worker m_ptr = other.m_ptr;
348*35238bceSAndroid Build Coastguard Worker m_state = other.m_state;
349*35238bceSAndroid Build Coastguard Worker
350*35238bceSAndroid Build Coastguard Worker acquire();
351*35238bceSAndroid Build Coastguard Worker
352*35238bceSAndroid Build Coastguard Worker return *this;
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker
355*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
356*35238bceSAndroid Build Coastguard Worker * \brief Assign from other shared pointer.
357*35238bceSAndroid Build Coastguard Worker * \param other Pointer to be shared.
358*35238bceSAndroid Build Coastguard Worker * \return Reference to this SharedPtr.
359*35238bceSAndroid Build Coastguard Worker *
360*35238bceSAndroid Build Coastguard Worker * Reference to current pointer is released and reference to new pointer is
361*35238bceSAndroid Build Coastguard Worker * acquired.
362*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
363*35238bceSAndroid Build Coastguard Worker template <typename T>
operator =(const SharedPtr<T> & other)364*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T> &SharedPtr<T>::operator=(const SharedPtr<T> &other)
365*35238bceSAndroid Build Coastguard Worker {
366*35238bceSAndroid Build Coastguard Worker if (m_state == other.m_state)
367*35238bceSAndroid Build Coastguard Worker return *this;
368*35238bceSAndroid Build Coastguard Worker
369*35238bceSAndroid Build Coastguard Worker // Release current reference.
370*35238bceSAndroid Build Coastguard Worker release();
371*35238bceSAndroid Build Coastguard Worker
372*35238bceSAndroid Build Coastguard Worker // Copy from other and acquire reference.
373*35238bceSAndroid Build Coastguard Worker m_ptr = other.m_ptr;
374*35238bceSAndroid Build Coastguard Worker m_state = other.m_state;
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker acquire();
377*35238bceSAndroid Build Coastguard Worker
378*35238bceSAndroid Build Coastguard Worker return *this;
379*35238bceSAndroid Build Coastguard Worker }
380*35238bceSAndroid Build Coastguard Worker
381*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
382*35238bceSAndroid Build Coastguard Worker * \brief Assign from weak pointer.
383*35238bceSAndroid Build Coastguard Worker * \param other Weak reference.
384*35238bceSAndroid Build Coastguard Worker * \return Reference to this SharedPtr.
385*35238bceSAndroid Build Coastguard Worker *
386*35238bceSAndroid Build Coastguard Worker * Tries to acquire reference to WeakPtr, releases current reference and
387*35238bceSAndroid Build Coastguard Worker * holds reference to new pointer.
388*35238bceSAndroid Build Coastguard Worker *
389*35238bceSAndroid Build Coastguard Worker * If WeakPtr can't be acquired, throws DeadReferenceException and doesn't
390*35238bceSAndroid Build Coastguard Worker * release the current reference.
391*35238bceSAndroid Build Coastguard Worker *
392*35238bceSAndroid Build Coastguard Worker * If WeakPtr references same pointer as SharedPtr this call will always
393*35238bceSAndroid Build Coastguard Worker * succeed.
394*35238bceSAndroid Build Coastguard Worker *
395*35238bceSAndroid Build Coastguard Worker * Y* must be convertible to T*.
396*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
397*35238bceSAndroid Build Coastguard Worker template <typename T>
398*35238bceSAndroid Build Coastguard Worker template <typename Y>
operator =(const WeakPtr<Y> & other)399*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T> &SharedPtr<T>::operator=(const WeakPtr<Y> &other)
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker if (m_state == other.m_state)
402*35238bceSAndroid Build Coastguard Worker return *this;
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker {
405*35238bceSAndroid Build Coastguard Worker SharedPtr<T> sharedOther(other);
406*35238bceSAndroid Build Coastguard Worker *this = other;
407*35238bceSAndroid Build Coastguard Worker }
408*35238bceSAndroid Build Coastguard Worker
409*35238bceSAndroid Build Coastguard Worker return *this;
410*35238bceSAndroid Build Coastguard Worker }
411*35238bceSAndroid Build Coastguard Worker
412*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
413*35238bceSAndroid Build Coastguard Worker * \brief Type conversion operator.
414*35238bceSAndroid Build Coastguard Worker *
415*35238bceSAndroid Build Coastguard Worker * T* must be convertible to Y*.
416*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
417*35238bceSAndroid Build Coastguard Worker template <class T>
418*35238bceSAndroid Build Coastguard Worker template <typename Y>
operator SharedPtr<Y>(void) const419*35238bceSAndroid Build Coastguard Worker inline SharedPtr<T>::operator SharedPtr<Y>(void) const
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker return SharedPtr<Y>(*this);
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
425*35238bceSAndroid Build Coastguard Worker * \brief Compare pointers.
426*35238bceSAndroid Build Coastguard Worker * \param a A
427*35238bceSAndroid Build Coastguard Worker * \param b B
428*35238bceSAndroid Build Coastguard Worker * \return true if A and B point to same object, false otherwise.
429*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
430*35238bceSAndroid Build Coastguard Worker template <class T, class U>
operator ==(const SharedPtr<T> & a,const SharedPtr<U> & b)431*35238bceSAndroid Build Coastguard Worker inline bool operator==(const SharedPtr<T> &a, const SharedPtr<U> &b) throw()
432*35238bceSAndroid Build Coastguard Worker {
433*35238bceSAndroid Build Coastguard Worker return a.get() == b.get();
434*35238bceSAndroid Build Coastguard Worker }
435*35238bceSAndroid Build Coastguard Worker
436*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
437*35238bceSAndroid Build Coastguard Worker * \brief Compare pointers.
438*35238bceSAndroid Build Coastguard Worker * \param a A
439*35238bceSAndroid Build Coastguard Worker * \param b B
440*35238bceSAndroid Build Coastguard Worker * \return true if A and B point to different objects, false otherwise.
441*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
442*35238bceSAndroid Build Coastguard Worker template <class T, class U>
operator !=(const SharedPtr<T> & a,const SharedPtr<U> & b)443*35238bceSAndroid Build Coastguard Worker inline bool operator!=(const SharedPtr<T> &a, const SharedPtr<U> &b) throw()
444*35238bceSAndroid Build Coastguard Worker {
445*35238bceSAndroid Build Coastguard Worker return a.get() != b.get();
446*35238bceSAndroid Build Coastguard Worker }
447*35238bceSAndroid Build Coastguard Worker
448*35238bceSAndroid Build Coastguard Worker /** Swap pointer contents. */
449*35238bceSAndroid Build Coastguard Worker template <typename T>
swap(SharedPtr<T> & other)450*35238bceSAndroid Build Coastguard Worker inline void SharedPtr<T>::swap(SharedPtr<T> &other)
451*35238bceSAndroid Build Coastguard Worker {
452*35238bceSAndroid Build Coastguard Worker using std::swap;
453*35238bceSAndroid Build Coastguard Worker swap(m_ptr, other.m_ptr);
454*35238bceSAndroid Build Coastguard Worker swap(m_state, other.m_state);
455*35238bceSAndroid Build Coastguard Worker }
456*35238bceSAndroid Build Coastguard Worker
457*35238bceSAndroid Build Coastguard Worker /** Swap operator for SharedPtr's. */
458*35238bceSAndroid Build Coastguard Worker template <typename T>
swap(SharedPtr<T> & a,SharedPtr<T> & b)459*35238bceSAndroid Build Coastguard Worker inline void swap(SharedPtr<T> &a, SharedPtr<T> &b)
460*35238bceSAndroid Build Coastguard Worker {
461*35238bceSAndroid Build Coastguard Worker a.swap(b);
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
465*35238bceSAndroid Build Coastguard Worker * \brief Set pointer to null.
466*35238bceSAndroid Build Coastguard Worker *
467*35238bceSAndroid Build Coastguard Worker * clear() removes current reference and sets pointer to null value.
468*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
469*35238bceSAndroid Build Coastguard Worker template <typename T>
clear(void)470*35238bceSAndroid Build Coastguard Worker inline void SharedPtr<T>::clear(void)
471*35238bceSAndroid Build Coastguard Worker {
472*35238bceSAndroid Build Coastguard Worker release();
473*35238bceSAndroid Build Coastguard Worker m_ptr = DE_NULL;
474*35238bceSAndroid Build Coastguard Worker m_state = DE_NULL;
475*35238bceSAndroid Build Coastguard Worker }
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker template <typename T>
acquireFromWeak(const WeakPtr<T> & weakRef)478*35238bceSAndroid Build Coastguard Worker inline void SharedPtr<T>::acquireFromWeak(const WeakPtr<T> &weakRef)
479*35238bceSAndroid Build Coastguard Worker {
480*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_ptr && !m_state);
481*35238bceSAndroid Build Coastguard Worker
482*35238bceSAndroid Build Coastguard Worker SharedPtrStateBase *state = weakRef.m_state;
483*35238bceSAndroid Build Coastguard Worker
484*35238bceSAndroid Build Coastguard Worker if (!state)
485*35238bceSAndroid Build Coastguard Worker return; // Empty reference.
486*35238bceSAndroid Build Coastguard Worker
487*35238bceSAndroid Build Coastguard Worker {
488*35238bceSAndroid Build Coastguard Worker int32_t oldCount, newCount;
489*35238bceSAndroid Build Coastguard Worker
490*35238bceSAndroid Build Coastguard Worker // Do atomic compare and increment.
491*35238bceSAndroid Build Coastguard Worker do
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker oldCount = state->strongRefCount;
494*35238bceSAndroid Build Coastguard Worker if (oldCount == 0)
495*35238bceSAndroid Build Coastguard Worker throw DeadReferenceException();
496*35238bceSAndroid Build Coastguard Worker newCount = oldCount + 1;
497*35238bceSAndroid Build Coastguard Worker } while (deAtomicCompareExchange32((uint32_t volatile *)&state->strongRefCount, (uint32_t)oldCount,
498*35238bceSAndroid Build Coastguard Worker (uint32_t)newCount) != (uint32_t)oldCount);
499*35238bceSAndroid Build Coastguard Worker
500*35238bceSAndroid Build Coastguard Worker deAtomicIncrement32(&state->weakRefCount);
501*35238bceSAndroid Build Coastguard Worker }
502*35238bceSAndroid Build Coastguard Worker
503*35238bceSAndroid Build Coastguard Worker m_ptr = weakRef.m_ptr;
504*35238bceSAndroid Build Coastguard Worker m_state = state;
505*35238bceSAndroid Build Coastguard Worker }
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard Worker template <typename T>
acquire(void)508*35238bceSAndroid Build Coastguard Worker inline void SharedPtr<T>::acquire(void)
509*35238bceSAndroid Build Coastguard Worker {
510*35238bceSAndroid Build Coastguard Worker if (m_state)
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker deAtomicIncrement32(&m_state->strongRefCount);
513*35238bceSAndroid Build Coastguard Worker deAtomicIncrement32(&m_state->weakRefCount);
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker }
516*35238bceSAndroid Build Coastguard Worker
517*35238bceSAndroid Build Coastguard Worker template <typename T>
release(void)518*35238bceSAndroid Build Coastguard Worker inline void SharedPtr<T>::release(void)
519*35238bceSAndroid Build Coastguard Worker {
520*35238bceSAndroid Build Coastguard Worker if (m_state)
521*35238bceSAndroid Build Coastguard Worker {
522*35238bceSAndroid Build Coastguard Worker if (deAtomicDecrement32(&m_state->strongRefCount) == 0)
523*35238bceSAndroid Build Coastguard Worker {
524*35238bceSAndroid Build Coastguard Worker m_ptr = DE_NULL;
525*35238bceSAndroid Build Coastguard Worker m_state->deletePtr();
526*35238bceSAndroid Build Coastguard Worker }
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker if (deAtomicDecrement32(&m_state->weakRefCount) == 0)
529*35238bceSAndroid Build Coastguard Worker {
530*35238bceSAndroid Build Coastguard Worker delete m_state;
531*35238bceSAndroid Build Coastguard Worker m_state = DE_NULL;
532*35238bceSAndroid Build Coastguard Worker }
533*35238bceSAndroid Build Coastguard Worker }
534*35238bceSAndroid Build Coastguard Worker }
535*35238bceSAndroid Build Coastguard Worker
536*35238bceSAndroid Build Coastguard Worker // WeakPtr template implementation.
537*35238bceSAndroid Build Coastguard Worker
538*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
539*35238bceSAndroid Build Coastguard Worker * \brief Construct empty weak pointer.
540*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
541*35238bceSAndroid Build Coastguard Worker template <typename T>
WeakPtr(void)542*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T>::WeakPtr(void) : m_ptr(DE_NULL)
543*35238bceSAndroid Build Coastguard Worker , m_state(DE_NULL)
544*35238bceSAndroid Build Coastguard Worker {
545*35238bceSAndroid Build Coastguard Worker }
546*35238bceSAndroid Build Coastguard Worker
547*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
548*35238bceSAndroid Build Coastguard Worker * \brief Construct weak pointer from other weak reference.
549*35238bceSAndroid Build Coastguard Worker * \param other Weak reference.
550*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
551*35238bceSAndroid Build Coastguard Worker template <typename T>
WeakPtr(const WeakPtr<T> & other)552*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T>::WeakPtr(const WeakPtr<T> &other) : m_ptr(other.m_ptr)
553*35238bceSAndroid Build Coastguard Worker , m_state(other.m_state)
554*35238bceSAndroid Build Coastguard Worker {
555*35238bceSAndroid Build Coastguard Worker acquire();
556*35238bceSAndroid Build Coastguard Worker }
557*35238bceSAndroid Build Coastguard Worker
558*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
559*35238bceSAndroid Build Coastguard Worker * \brief Construct weak pointer from shared pointer.
560*35238bceSAndroid Build Coastguard Worker * \param other Shared pointer.
561*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
562*35238bceSAndroid Build Coastguard Worker template <typename T>
WeakPtr(const SharedPtr<T> & other)563*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T>::WeakPtr(const SharedPtr<T> &other) : m_ptr(other.m_ptr)
564*35238bceSAndroid Build Coastguard Worker , m_state(other.m_state)
565*35238bceSAndroid Build Coastguard Worker {
566*35238bceSAndroid Build Coastguard Worker acquire();
567*35238bceSAndroid Build Coastguard Worker }
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker template <typename T>
~WeakPtr(void)570*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T>::~WeakPtr(void)
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker release();
573*35238bceSAndroid Build Coastguard Worker }
574*35238bceSAndroid Build Coastguard Worker
575*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
576*35238bceSAndroid Build Coastguard Worker * \brief Assign from another weak pointer.
577*35238bceSAndroid Build Coastguard Worker * \param other Weak reference.
578*35238bceSAndroid Build Coastguard Worker * \return Reference to this WeakPtr.
579*35238bceSAndroid Build Coastguard Worker *
580*35238bceSAndroid Build Coastguard Worker * The current weak reference is removed first and then a new weak reference
581*35238bceSAndroid Build Coastguard Worker * to the object pointed by other is taken.
582*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
583*35238bceSAndroid Build Coastguard Worker template <typename T>
operator =(const WeakPtr<T> & other)584*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T> &WeakPtr<T>::operator=(const WeakPtr<T> &other)
585*35238bceSAndroid Build Coastguard Worker {
586*35238bceSAndroid Build Coastguard Worker if (this == &other)
587*35238bceSAndroid Build Coastguard Worker return *this;
588*35238bceSAndroid Build Coastguard Worker
589*35238bceSAndroid Build Coastguard Worker release();
590*35238bceSAndroid Build Coastguard Worker
591*35238bceSAndroid Build Coastguard Worker m_ptr = other.m_ptr;
592*35238bceSAndroid Build Coastguard Worker m_state = other.m_state;
593*35238bceSAndroid Build Coastguard Worker
594*35238bceSAndroid Build Coastguard Worker acquire();
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker return *this;
597*35238bceSAndroid Build Coastguard Worker }
598*35238bceSAndroid Build Coastguard Worker
599*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
600*35238bceSAndroid Build Coastguard Worker * \brief Assign from shared pointer.
601*35238bceSAndroid Build Coastguard Worker * \param other Shared pointer.
602*35238bceSAndroid Build Coastguard Worker * \return Reference to this WeakPtr.
603*35238bceSAndroid Build Coastguard Worker *
604*35238bceSAndroid Build Coastguard Worker * The current weak reference is removed first and then a new weak reference
605*35238bceSAndroid Build Coastguard Worker * to the object pointed by other is taken.
606*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
607*35238bceSAndroid Build Coastguard Worker template <typename T>
operator =(const SharedPtr<T> & other)608*35238bceSAndroid Build Coastguard Worker inline WeakPtr<T> &WeakPtr<T>::operator=(const SharedPtr<T> &other)
609*35238bceSAndroid Build Coastguard Worker {
610*35238bceSAndroid Build Coastguard Worker release();
611*35238bceSAndroid Build Coastguard Worker
612*35238bceSAndroid Build Coastguard Worker m_ptr = other.m_ptr;
613*35238bceSAndroid Build Coastguard Worker m_state = other.m_state;
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker acquire();
616*35238bceSAndroid Build Coastguard Worker
617*35238bceSAndroid Build Coastguard Worker return *this;
618*35238bceSAndroid Build Coastguard Worker }
619*35238bceSAndroid Build Coastguard Worker
620*35238bceSAndroid Build Coastguard Worker template <typename T>
acquire(void)621*35238bceSAndroid Build Coastguard Worker inline void WeakPtr<T>::acquire(void)
622*35238bceSAndroid Build Coastguard Worker {
623*35238bceSAndroid Build Coastguard Worker if (m_state)
624*35238bceSAndroid Build Coastguard Worker deAtomicIncrement32(&m_state->weakRefCount);
625*35238bceSAndroid Build Coastguard Worker }
626*35238bceSAndroid Build Coastguard Worker
627*35238bceSAndroid Build Coastguard Worker template <typename T>
release(void)628*35238bceSAndroid Build Coastguard Worker inline void WeakPtr<T>::release(void)
629*35238bceSAndroid Build Coastguard Worker {
630*35238bceSAndroid Build Coastguard Worker if (m_state)
631*35238bceSAndroid Build Coastguard Worker {
632*35238bceSAndroid Build Coastguard Worker if (deAtomicDecrement32(&m_state->weakRefCount) == 0)
633*35238bceSAndroid Build Coastguard Worker {
634*35238bceSAndroid Build Coastguard Worker delete m_state;
635*35238bceSAndroid Build Coastguard Worker m_state = DE_NULL;
636*35238bceSAndroid Build Coastguard Worker m_ptr = DE_NULL;
637*35238bceSAndroid Build Coastguard Worker }
638*35238bceSAndroid Build Coastguard Worker }
639*35238bceSAndroid Build Coastguard Worker }
640*35238bceSAndroid Build Coastguard Worker
641*35238bceSAndroid Build Coastguard Worker } // namespace de
642*35238bceSAndroid Build Coastguard Worker
643*35238bceSAndroid Build Coastguard Worker #endif // _DESHAREDPTR_HPP
644