Arcane  v3.15.3.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-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/* RefDeclarations.h (C) 2000-2025 */
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
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arccore
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
63constexpr int REF_TAG_SHARED_PTR = 0;
64constexpr int REF_TAG_REFERENCE_COUNTER = 1;
65
71template<typename InstanceType,class T>
73{
74 static constexpr int TagId = REF_TAG_SHARED_PTR;
75};
76
83template<typename InstanceType>
84struct RefTraits<InstanceType,std::enable_if_t<std::is_same_v<typename InstanceType::ReferenceCounterTagType,ReferenceCounterTag>>>
85{
86 static constexpr int TagId = REF_TAG_REFERENCE_COUNTER;
87};
88
89//template<typename InstanceType,
90// int ImplTagId = RefTraits<InstanceType>::TagId>
91//class Ref;
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
96template<typename InstanceType,int TagType>
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102namespace impl
103{
105template <typename T, typename = int>
107: std::false_type
108{
109};
110template <typename T>
111struct HasInternalRemoveReference<T, decltype(&T::_internalRemoveReference, 0)>
112: std::true_type
113{
114};
115
117template <typename T, typename = int>
119: std::false_type
120{
121};
122template <typename T>
123struct HasInternalAddReference<T, decltype(&T::_internalAddReference, 0)>
124: std::true_type
125{
126};
127
128}
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
139template<class T>
141{
142 public:
143 static void addReference(T* t)
144 {
146 t->_internalAddReference();
147 else
148 t->addReference();
149 }
150 static void removeReference(T* t)
151 {
153 bool need_destroy = t->_internalRemoveReference();
154 if (need_destroy)
155 delete t;
156 }
157 else
158 t->removeReference();
159 }
160};
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
165template<class T>
167{
168 public:
169 static ARCCORE_EXPORT void addReference(T* t);
170 static ARCCORE_EXPORT void removeReference(T* t);
171};
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
198#define ARCCORE_DECLARE_REFERENCE_COUNTED_INCLASS_METHODS() \
199 private:\
200 template<typename T> friend class Arccore::ExternalReferenceCounterAccessor; \
201 template<typename T> friend class Arccore::ReferenceCounterAccessor;\
202 public: \
203 using ReferenceCounterTagType = Arccore::ReferenceCounterTag ; \
204 virtual ::Arccore::ReferenceCounterImpl* _internalReferenceCounter() =0; \
205 virtual void _internalAddReference() =0;\
206 [[nodiscard]] virtual bool _internalRemoveReference() =0
207 // NOTE: les classes 'friend' sont nécessaires pour l'accès au destructeur.
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
230#define ARCCORE_DECLARE_REFERENCE_COUNTED_CLASS(class_name) \
231namespace Arccore {\
232template<> \
233struct RefTraits<class_name> \
234{\
235 static constexpr int TagId = Arccore::REF_TAG_REFERENCE_COUNTER;\
236};\
237template<>\
238class ReferenceCounterAccessor<class_name>\
239: public ExternalReferenceCounterAccessor<class_name>\
240{}; \
241}
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
246} // End namespace Arccore
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251#endif
252
Déclarations des types de la composante 'base' de Arccore.
Accesseur des méthodes de gestion de compteurs de référence.
Espace de nom de Arccore.
Definition ArcaneTypes.h:29
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.
Classe template pour vérifier si T a la méthode _internalAddReference()
Classe template pour vérifier si T a la méthode _internalRemoveReference()