Version: 9.16.0
AutoRefCnt.hxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#ifndef __AUTOREFCNT_HXX__
21#define __AUTOREFCNT_HXX__
22
23#include "Exception.hxx"
24
25namespace YACS
26{
27 namespace BASES
28 {
29 template<class T>
31 {
32 public:
33 AutoRefCnt(const AutoRefCnt& other):_ptr(0) { referPtr(other._ptr); }
34 AutoRefCnt(T *ptr=0):_ptr(ptr) { }
36 bool isNull() const { return _ptr==0; }
37 bool isNotNull() const { return !isNull(); }
38 void nullify() { destroyPtr(); _ptr=0; }
39 bool operator==(const AutoRefCnt& other) const { return _ptr==other._ptr; }
40 bool operator==(const T *other) const { return _ptr==other; }
41 AutoRefCnt &operator=(const AutoRefCnt& other) { if(_ptr!=other._ptr) { destroyPtr(); referPtr(other._ptr); } return *this; }
42 AutoRefCnt &operator=(T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; } return *this; }
43 T *operator->() { return _ptr ; }
44 const T *operator->() const { return _ptr; }
45 T& operator*() { return *_ptr; }
46 const T& operator*() const { return *_ptr; }
47 operator T *() { return _ptr; }
48 operator const T *() const { return _ptr; }
49 T *retn() { if(_ptr) _ptr->incrRef(); return _ptr; }
50 void takeRef(T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; if(_ptr) _ptr->incrRef(); } }
51 private:
52 void referPtr(T *ptr) { _ptr=ptr; if(_ptr) _ptr->incrRef(); }
53 void destroyPtr() { if(_ptr) _ptr->decrRef(); }
54 private:
56 };
57
58 template<class T>
60 {
61 public:
62 AutoConstRefCnt(const AutoConstRefCnt& other):_ptr(0) { referPtr(other._ptr); }
63 AutoConstRefCnt(const T *ptr=0):_ptr(ptr) { }
65 bool isNull() const { return _ptr==0; }
66 bool isNotNull() const { return !isNull(); }
67 void nullify() { destroyPtr(); _ptr=0; }
68 bool operator==(const AutoConstRefCnt& other) const { return _ptr==other._ptr; }
69 bool operator==(const T *other) const { return _ptr==other; }
70 AutoConstRefCnt &operator=(const AutoConstRefCnt& other) { if(_ptr!=other._ptr) { destroyPtr(); referPtr(other._ptr); } return *this; }
71 AutoConstRefCnt &operator=(const T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; } return *this; }
72 const T *operator->() const { return _ptr; }
73 const T& operator*() const { return *_ptr; }
74 operator const T *() const { return _ptr; }
75 const T *retn() { if(_ptr) _ptr->incrRef(); return _ptr; }
76 void takeRef(const T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; if(_ptr) _ptr->incrRef(); } }
77 private:
78 void referPtr(const T *ptr) { _ptr=ptr; if(_ptr) _ptr->incrRef(); }
79 void destroyPtr() { if(_ptr) _ptr->decrRef(); }
80 private:
81 const T *_ptr;
82 };
83
84 template<class T, class U>
86 {
87 T *subPtr(autoSubPtr);
88 U *ptr(dynamic_cast<U *>(subPtr));
89 typename YACS::BASES::AutoRefCnt<U> ret(ptr);
90 if(ptr)
91 ptr->incrRef();
92 return ret;
93 }
94
95 template<class T, class U>
97 {
98 T *subPtr(autoSubPtr);
99 U *ptr(dynamic_cast<U *>(subPtr));
100 if(subPtr && !ptr)
101 throw Exception("DynamicCastSafe : U is not a subtype of T !");
102 typename YACS::BASES::AutoRefCnt<U> ret(ptr);
103 if(ptr)
104 ptr->incrRef();
105 return ret;
106 }
107
108 template<class T>
110 {
111 public:
112 AutoCppPtr(T *ptr=0):_ptr(ptr) { }
114 AutoCppPtr &operator=(T *ptr) { if(_ptr!=ptr) { destroyPtr(); _ptr=ptr; } return *this; }
115 T *operator->() { return _ptr ; }
116 const T *operator->() const { return _ptr; }
117 T& operator*() { return *_ptr; }
118 const T& operator*() const { return *_ptr; }
119 operator T *() { return _ptr; }
120 operator const T *() const { return _ptr; }
121 private:
122 void destroyPtr() { delete _ptr; }
123 private:
125 };
126 }
127}
128
129#endif
void referPtr(const T *ptr)
Definition: AutoRefCnt.hxx:78
void takeRef(const T *ptr)
Definition: AutoRefCnt.hxx:76
const T & operator*() const
Definition: AutoRefCnt.hxx:73
AutoConstRefCnt & operator=(const T *ptr)
Definition: AutoRefCnt.hxx:71
AutoConstRefCnt(const T *ptr=0)
Definition: AutoRefCnt.hxx:63
bool operator==(const T *other) const
Definition: AutoRefCnt.hxx:69
bool operator==(const AutoConstRefCnt &other) const
Definition: AutoRefCnt.hxx:68
AutoConstRefCnt(const AutoConstRefCnt &other)
Definition: AutoRefCnt.hxx:62
const T * operator->() const
Definition: AutoRefCnt.hxx:72
AutoConstRefCnt & operator=(const AutoConstRefCnt &other)
Definition: AutoRefCnt.hxx:70
const T * operator->() const
Definition: AutoRefCnt.hxx:116
const T & operator*() const
Definition: AutoRefCnt.hxx:118
AutoCppPtr & operator=(T *ptr)
Definition: AutoRefCnt.hxx:114
AutoRefCnt & operator=(T *ptr)
Definition: AutoRefCnt.hxx:42
const T * operator->() const
Definition: AutoRefCnt.hxx:44
bool operator==(const T *other) const
Definition: AutoRefCnt.hxx:40
const T & operator*() const
Definition: AutoRefCnt.hxx:46
AutoRefCnt(const AutoRefCnt &other)
Definition: AutoRefCnt.hxx:33
AutoRefCnt & operator=(const AutoRefCnt &other)
Definition: AutoRefCnt.hxx:41
bool isNotNull() const
Definition: AutoRefCnt.hxx:37
bool operator==(const AutoRefCnt &other) const
Definition: AutoRefCnt.hxx:39
YACS::BASES::AutoRefCnt< U > DynamicCastSafe(typename YACS::BASES::AutoRefCnt< T > &autoSubPtr)
Definition: AutoRefCnt.hxx:96
YACS::BASES::AutoRefCnt< U > DynamicCast(typename YACS::BASES::AutoRefCnt< T > &autoSubPtr) noexcept
Definition: AutoRefCnt.hxx:85