Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AutoRef.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* AutoRef.h (C) 2000-2024 */
9/* */
10/* Encapsulation d'un pointeur avec compteur de référence. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_AUTOREF_H
13#define ARCANE_UTILS_AUTOREF_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Ptr.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \brief Encapsulation d'un pointeur avec compteur de référence.
29 *
30 * Cette classe renferme un pointeur d'un type qui implémente les méthodes
31 * de la classe abstraite ISharedReference (le paramètre template n'a pas
32 * besoin de dériver de cette classe) et incrémente (_addRef()) ou décrémente
33 * (_removeRef()) le compteur de référence de l'élément pointé lors des
34 * affectations succéssives. Cette classe n'effectue aucune action basée
35 * sur la valeur de compteur de référence; la destruction éventuelle de l'objet
36 * lorsque le compteur de référence arrive à zéro est gérée par l'objet lui même.
37 */
38template <class T>
40: public PtrT<T>
41{
42 public:
43
44 //! Type de la classe de base
46
48
49 public:
50
51 //! Construit une instance sans référence
52 AutoRefT() = default;
53 //! Construit une instance référant \a t
54 explicit AutoRefT(T* t)
55 : BaseClass()
56 {
57 _changeValue(t);
58 }
59 //! Construit une référence référant \a from
60 AutoRefT(const AutoRefT<T>& from)
61 : BaseClass()
62 {
63 _changeValue(from.m_value);
64 }
65
66 //! Opérateur de copie
68 {
69 _changeValue(from.m_value);
70 return (*this);
71 }
72
73 //! Affecte à l'instance la value \a new_value
74 AutoRefT<T>& operator=(T* new_value)
75 {
76 _changeValue(new_value);
77 return (*this);
78 }
79
80 //! Destructeur. Décrément le compteur de référence de l'objet pointé
81 ~AutoRefT() { _removeRef(); }
82
83 private:
84
85 //! Ajoute une référence à l'objet encapsulé si non nul
86 void _addRef()
87 {
88 if (m_value)
89 m_value->addRef();
90 }
91 //! Supprimer une référence à l'objet encapsulé si non nul
92 void _removeRef()
93 {
94 if (m_value)
95 m_value->removeRef();
96 }
97 //! Change l'objet référencé en \a new_value
98 void _changeValue(T* new_value)
99 {
100 if (m_value == new_value)
101 return;
102 _removeRef();
103 m_value = new_value;
104 _addRef();
105 }
106};
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110/*!
111 * \brief Encapsulation d'un pointeur avec compteur de référence.
112 *
113 * Cette classe renferme un pointeur d'un type qui implémente les méthodes
114 * de la classe abstraite ISharedReference (le paramètre template n'a pas
115 * besoin de dériver de cette classe) et incrémente (_addRef()) ou décrémente
116 * (_removeRef()) le compteur de référence de l'élément pointé lors des
117 * affectations succéssives. Cette classe n'effectue aucune action basée
118 * sur la valeur de compteur de référence; la destruction éventuelle de l'objet
119 * lorsque le compteur de référence arrive à zéro est gérée par l'objet lui même.
120 */
121template <class T>
123{
124 public:
125
126 using ThatClass = AutoRef2<T>;
127
128 public:
129
130 //! Construit une instance sans référence
131 AutoRef2() = default;
132 //! Construit une instance référant \a t
133 explicit AutoRef2(T* t)
134 {
135 _changeValue(t);
136 }
137 //! Construit une référence référant \a from
138 AutoRef2(const ThatClass& from)
139 {
140 _changeValue(from.m_value);
141 }
142 //! Construit une référence référant \a from
143 AutoRef2(ThatClass&& from) noexcept
144 : m_value(from.m_value)
145 {
146 from.m_value = nullptr;
147 }
148
149 //! Opérateur de copie
150 ThatClass& operator=(const ThatClass& from)
151 {
152 _changeValue(from.m_value);
153 return (*this);
154 }
155 //! Opérateur de déplacement
156 ThatClass& operator=(ThatClass&& from) noexcept
157 {
158 _removeRef();
159 m_value = from.m_value;
160 from.m_value = nullptr;
161 return (*this);
162 }
163
164 //! Affecte à l'instance la value \a new_value
165 ThatClass& operator=(T* new_value)
166 {
167 _changeValue(new_value);
168 return (*this);
169 }
170
171 //! Destructeur. Décrément le compteur de référence de l'objet pointé
172 ~AutoRef2() { _removeRef(); }
173
174 //! Retourne l'objet référé par l'instance
175 T* operator->() const
176 {
177 ARCANE_CHECK_PTR(m_value);
178 return m_value;
179 }
180
181 //! Retourne l'objet référé par l'instance
182 inline T& operator*() const
183 {
184 ARCANE_CHECK_PTR(m_value);
185 return *m_value;
186 }
187
188 //! Retourne l'objet référé par l'instance
189 T* get() const { return m_value; }
190
191 bool isNull() const { return !m_value; }
192 operator bool() const { return m_value; }
193
194 friend bool operator==(const ThatClass& a, const ThatClass& b)
195 {
196 return a.get() == b.get();
197 }
198 friend bool operator!=(const ThatClass& a, const ThatClass& b)
199 {
200 return a.get() != b.get();
201 }
202
203 private:
204
205 //! Ajoute une référence à l'objet encapsulé si non nul
206 void _addRef()
207 {
208 if (m_value)
209 m_value->addRef();
210 }
211 //! Supprimer une référence à l'objet encapsulé si non nul
212 void _removeRef()
213 {
214 if (m_value)
215 m_value->removeRef();
216 }
217 //! Change l'objet référencé en \a new_value
218 void _changeValue(T* new_value)
219 {
220 if (m_value == new_value)
221 return;
222 _removeRef();
223 m_value = new_value;
224 _addRef();
225 }
226
227 private:
228
229 T* m_value = nullptr; //!< Pointeur sur l'objet référencé
230};
231
232/*---------------------------------------------------------------------------*/
233/*---------------------------------------------------------------------------*/
234
235} // namespace Arcane
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
240#endif
Encapsulation d'un pointeur avec compteur de référence.
Definition AutoRef.h:123
ThatClass & operator=(ThatClass &&from) noexcept
Opérateur de déplacement.
Definition AutoRef.h:156
AutoRef2(const ThatClass &from)
Construit une référence référant from.
Definition AutoRef.h:138
AutoRef2()=default
Construit une instance sans référence.
AutoRef2(ThatClass &&from) noexcept
Construit une référence référant from.
Definition AutoRef.h:143
~AutoRef2()
Destructeur. Décrément le compteur de référence de l'objet pointé
Definition AutoRef.h:172
ThatClass & operator=(const ThatClass &from)
Opérateur de copie.
Definition AutoRef.h:150
T * get() const
Retourne l'objet référé par l'instance.
Definition AutoRef.h:189
T & operator*() const
Retourne l'objet référé par l'instance.
Definition AutoRef.h:182
ThatClass & operator=(T *new_value)
Affecte à l'instance la value new_value.
Definition AutoRef.h:165
T * operator->() const
Retourne l'objet référé par l'instance.
Definition AutoRef.h:175
AutoRef2(T *t)
Construit une instance référant t.
Definition AutoRef.h:133
Encapsulation d'un pointeur avec compteur de référence.
Definition AutoRef.h:41
T * m_value
Pointeur sur l'objet référencé
Definition Ptr.h:127
AutoRefT()=default
Construit une instance sans référence.
~AutoRefT()
Destructeur. Décrément le compteur de référence de l'objet pointé
Definition AutoRef.h:81
AutoRefT(T *t)
Construit une instance référant t.
Definition AutoRef.h:54
AutoRefT(const AutoRefT< T > &from)
Construit une référence référant from.
Definition AutoRef.h:60
AutoRefT< T > & operator=(T *new_value)
Affecte à l'instance la value new_value.
Definition AutoRef.h:74
AutoRefT< T > & operator=(const AutoRefT< T > &from)
Opérateur de copie.
Definition AutoRef.h:67
Encapsulation d'un pointeur.
Definition Ptr.h:45
T * m_value
Pointeur sur l'objet référencé
Definition Ptr.h:127
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-