Arcane  4.1.11.0
Documentation développeur
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
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/*---------------------------------------------------------------------------*/
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82
83constexpr int REF_TAG_SHARED_PTR = 0;
84constexpr int REF_TAG_REFERENCE_COUNTER = 1;
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
96inline constexpr int arcaneImplGetRefTagId(void*)
97{
98 return REF_TAG_SHARED_PTR;
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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.