Arcane  v4.1.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AutoRef2.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* AutoRef2.h (C) 2000-2025 */
9/* */
10/* Encapsulation d'un pointeur avec compteur de référence. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_AUTOREF2_H
13#define ARCCORE_BASE_AUTOREF2_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/ArccoreGlobal.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{
41 public:
42
43 using ThatClass = AutoRef2<T>;
44
45 public:
46
47 //! Construit une instance sans référence
48 AutoRef2() = default;
49 //! Construit une instance référant \a t
50 explicit AutoRef2(T* t)
51 {
52 _changeValue(t);
53 }
54 //! Construit une référence référant \a from
55 AutoRef2(const ThatClass& from)
56 {
57 _changeValue(from.m_value);
58 }
59 //! Construit une référence référant \a from
60 AutoRef2(ThatClass&& from) noexcept
61 : m_value(from.m_value)
62 {
63 from.m_value = nullptr;
64 }
65
66 //! Opérateur de copie
67 ThatClass& operator=(const ThatClass& from)
68 {
69 _changeValue(from.m_value);
70 return (*this);
71 }
72 //! Opérateur de déplacement
73 ThatClass& operator=(ThatClass&& from) noexcept
74 {
75 _removeRef();
76 m_value = from.m_value;
77 from.m_value = nullptr;
78 return (*this);
79 }
80
81 //! Affecte à l'instance la value \a new_value
82 ThatClass& operator=(T* new_value)
83 {
84 _changeValue(new_value);
85 return (*this);
86 }
87
88 //! Destructeur. Décrément le compteur de référence de l'objet pointé
89 ~AutoRef2() { _removeRef(); }
90
91 //! Retourne l'objet référé par l'instance
92 T* operator->() const
93 {
94 ARCCORE_CHECK_PTR(m_value);
95 return m_value;
96 }
97
98 //! Retourne l'objet référé par l'instance
99 inline T& operator*() const
100 {
101 ARCCORE_CHECK_PTR(m_value);
102 return *m_value;
103 }
104
105 //! Retourne l'objet référé par l'instance
106 T* get() const { return m_value; }
107
108 bool isNull() const { return !m_value; }
109 operator bool() const { return m_value; }
110
111 friend bool operator==(const ThatClass& a, const ThatClass& b)
112 {
113 return a.get() == b.get();
114 }
115 friend bool operator!=(const ThatClass& a, const ThatClass& b)
116 {
117 return a.get() != b.get();
118 }
119
120 private:
121
122 //! Ajoute une référence à l'objet encapsulé si non nul
123 void _addRef()
124 {
125 if (m_value)
126 m_value->addRef();
127 }
128 //! Supprimer une référence à l'objet encapsulé si non nul
129 void _removeRef()
130 {
131 if (m_value)
132 m_value->removeRef();
133 }
134 //! Change l'objet référencé en \a new_value
135 void _changeValue(T* new_value)
136 {
137 if (m_value == new_value)
138 return;
139 _removeRef();
140 m_value = new_value;
141 _addRef();
142 }
143
144 private:
145
146 T* m_value = nullptr; //!< Pointeur sur l'objet référencé
147};
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152} // namespace Arcane
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157#endif
ThatClass & operator=(ThatClass &&from) noexcept
Opérateur de déplacement.
Definition AutoRef2.h:73
AutoRef2(const ThatClass &from)
Construit une référence référant from.
Definition AutoRef2.h:55
AutoRef2()=default
Construit une instance sans référence.
AutoRef2(ThatClass &&from) noexcept
Construit une référence référant from.
Definition AutoRef2.h:60
~AutoRef2()
Destructeur. Décrément le compteur de référence de l'objet pointé
Definition AutoRef2.h:89
ThatClass & operator=(const ThatClass &from)
Opérateur de copie.
Definition AutoRef2.h:67
T * get() const
Retourne l'objet référé par l'instance.
Definition AutoRef2.h:106
T & operator*() const
Retourne l'objet référé par l'instance.
Definition AutoRef2.h:99
ThatClass & operator=(T *new_value)
Affecte à l'instance la value new_value.
Definition AutoRef2.h:82
T * operator->() const
Retourne l'objet référé par l'instance.
Definition AutoRef2.h:92
AutoRef2(T *t)
Construit une instance référant t.
Definition AutoRef2.h:50
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-