Version: 9.15.0
AutoRefCnt.hxx
Go to the documentation of this file.
1 // Copyright (C) 2006-2025 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 
25 namespace YACS
26 {
27  namespace BASES
28  {
29  template<class T>
30  class AutoRefCnt
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:
55  T *_ptr;
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>
85  typename YACS::BASES::AutoRefCnt<U> DynamicCast(typename YACS::BASES::AutoRefCnt<T>& autoSubPtr) noexcept
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:
124  T *_ptr;
125  };
126  }
127 }
128 
129 #endif
void referPtr(const T *ptr)
Definition: AutoRefCnt.hxx:78
void takeRef(const T *ptr)
Definition: AutoRefCnt.hxx:76
AutoConstRefCnt & operator=(const T *ptr)
Definition: AutoRefCnt.hxx:71
const T * operator->() const
Definition: AutoRefCnt.hxx:72
const T & operator*() const
Definition: AutoRefCnt.hxx:73
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
AutoConstRefCnt & operator=(const AutoConstRefCnt &other)
Definition: AutoRefCnt.hxx:70
AutoCppPtr & operator=(T *ptr)
Definition: AutoRefCnt.hxx:114
const T * operator->() const
Definition: AutoRefCnt.hxx:116
const T & operator*() const
Definition: AutoRefCnt.hxx:118
bool operator==(const T *other) const
Definition: AutoRefCnt.hxx:40
AutoRefCnt(const AutoRefCnt &other)
Definition: AutoRefCnt.hxx:33
const T * operator->() const
Definition: AutoRefCnt.hxx:44
const T & operator*() const
Definition: AutoRefCnt.hxx:46
bool isNotNull() const
Definition: AutoRefCnt.hxx:37
bool operator==(const AutoRefCnt &other) const
Definition: AutoRefCnt.hxx:39
AutoRefCnt & operator=(const AutoRefCnt &other)
Definition: AutoRefCnt.hxx:41
AutoRefCnt & operator=(T *ptr)
Definition: AutoRefCnt.hxx:42
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