Arcane  4.2.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
RefDeclarations.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* RefDeclarations.h (C) 2000-2026 */
9/* */
10/* Déclarations liées à la gestion des références sur une instance. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_REFDECLARATIONS_H
13#define ARCCORE_BASE_REFDECLARATIONS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22/*!
23 * \file RefDeclarations.h
24 *
25 * Ce fichier contient les déclarations et macros pour gérer classes
26 * utilisant les compteurs de référence. Pour l'implémentation il faut utiliser
27 * le fichier 'ReferenceCounterImpl.h'
28 */
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33// La classe ExternalReferenceCounterAccessor doit rester dans le namespace
34// Arccore pour compatiblité avec l'existant et la macro
35// ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS.
36namespace Arccore
37{
38template <class T>
40{
41 public:
42
43 static ARCCORE_EXPORT void addReference(T* t);
44 static ARCCORE_EXPORT void removeReference(T* t);
45};
46} // namespace Arccore
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51namespace Arcane
52{
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58/*!
59 * \brief Structure servant à tagger les interfaces/classes qui utilisent
60 * un compteur de référence interne.
61 *
62 * Ce tag s'utilise via un typedef comme suit:
63 *
64 * \code
65 * class MyClass
66 * {
67 * public:
68 * using ReferenceCounterTagType = ReferenceCounterTag;
69 * public:
70 * void addReference();
71 * void removeReference();
72 * };
73 * \endcode
74 */
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81constexpr int REF_TAG_SHARED_PTR = 0;
82constexpr int REF_TAG_REFERENCE_COUNTER = 1;
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87/*!
88 * \brief Fonction pour savoir quel type de compteur de référence
89 * utilise une classe.
90 *
91 * Par défaut on utilise std::shared_ptr.
92 * Pour utiliser un compteur de référence interne, il faur surcharger cette
93 * méthode via la macro ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS().
94 */
95inline constexpr int arcaneImplGetRefTagId(void*)
96{
97 return REF_TAG_SHARED_PTR;
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103/*!
104 * \brief Caractéristiques pour gérer les compteurs de référence.
105 *
106 * Par défaut, on utilise comme implémentation la classe std::shared_ptr.
107 */
108template <typename InstanceType>
110{
111 static constexpr int TagId = arcaneImplGetRefTagId(static_cast<InstanceType*>(nullptr));
112};
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
117template <typename InstanceType, int TagType>
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122
123/*!
124 * \brief Accesseur des méthodes de gestion de compteurs de référence.
125 *
126 * Le classe T doit définir deux méthodes addReference() et removeReference()
127 * pour gérer les compteurs de références. removeReference() doit détruire
128 * l'instance si le compteur arrive à zéro.
129 */
130template <class T>
132{
133 public:
134
135 static void addReference(T* t)
136 {
137 if constexpr (requires { t->_internalAddReference(); })
138 t->_internalAddReference();
139 else
140 t->addReference();
141 }
142 static void removeReference(T* t)
143 {
144 if constexpr (requires { t->_internalRemoveReference(); }) {
145 bool need_destroy = t->_internalRemoveReference();
146 if (need_destroy)
147 delete t;
148 }
149 else
150 t->removeReference();
151 }
152};
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157/*!
158 * \brief Macro pour déclarer les méthodes virtuelles gérant les compteurs
159 * de référence.
160 *
161 * Cette macro s'utilise de la même manière que les déclarations
162 * de méthodes d'une interface. Elle permet de définir des méthodes virtuelles
163 * pure pour accèder aux informations des compteurs de référence.
164 *
165 * La classe implémentant l'interface doit utiliser la macro
166 * ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS() pour définir les
167 * méthodes virtuelles utilisées.
168 *
169 * \code
170 * class IMyInterface
171 * {
172 * ARCCORE_DECLARE_REFERENCE_COUNTED_INCLASS_METHODS();
173 * public:
174 * virtual ~IMyInterface() = default;
175 * public:
176 * virtual void myMethod1() = 0;
177 * };
178 * \endcode
179 */
180#define ARCCORE_DECLARE_REFERENCE_COUNTED_INCLASS_METHODS() \
181 private: \
182\
183 template <typename T> friend class ::Arccore::ExternalReferenceCounterAccessor; \
184 template <typename T> friend class Arcane::ReferenceCounterAccessor; \
185\
186 public: \
187\
188 using ReferenceCounterTagType = ::Arcane::ReferenceCounterTag; \
189 virtual ::Arcane::ReferenceCounterImpl* _internalReferenceCounter() = 0; \
190 virtual void _internalAddReference() = 0; \
191 [[nodiscard]] virtual bool _internalRemoveReference() = 0
192// NOTE: les classes 'friend' sont nécessaires pour l'accès au destructeur.
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197/*!
198 * \brief Macro pour déclarer qu'une classe utilise un compteur de
199 * référence.
200 *
201 * La macro doit être utilisée en dehors de tout namespace. Par exemple :
202 *
203 * \code
204 * namespace MyNamespace
205 * {
206 * class MyClass;
207 * }
208 *
209 * ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(MyNamespace::MyClass);
210 * \endcode
211 *
212 * Il faudra ensuite utiliser la macro
213 * ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS() dans le fichier source pour
214 * définir les méthodes et types nécessaires
215 */
216#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name) \
217 namespace Arcane \
218 { \
219 template <> \
220 struct RefTraits<class_name> \
221 { \
222 static constexpr int TagId = ::Arcane::REF_TAG_REFERENCE_COUNTER; \
223 }; \
224 constexpr inline int arcaneImplGetRefTagId(class_name*) \
225 { \
226 return ::Arcane::REF_TAG_REFERENCE_COUNTER; \
227 } \
228 template <> \
229 class ReferenceCounterAccessor<class_name> \
230 : public ExternalReferenceCounterAccessor<class_name> \
231 {}; \
232 }
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
237} // End namespace Arcane
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242namespace Arccore
243{
244using Arcane::ReferenceCounterTag;
245}
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
250#endif
Déclarations des types de la composante 'base' de Arccore.
Accesseur des méthodes de gestion de compteurs de référence.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
constexpr int arcaneImplGetRefTagId(void *)
Fonction pour savoir quel type de compteur de référence utilise une classe.
Espace de nom de Arccore.
Caractéristiques pour gérer les compteurs de référence.
Structure servant à tagger les interfaces/classes qui utilisent un compteur de référence interne.