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