12#ifndef ARCCORE_BASE_REFERENCECOUNTERIMPL_H
13#define ARCCORE_BASE_REFERENCECOUNTERIMPL_H
18#include "arccore/base/ReferenceCounter.h"
19#include "arccore/base/RefBase.h"
41template <
class T> ARCCORE_EXPORT
void
45 if constexpr (
requires { t->_internalAddReference(); })
46 t->_internalAddReference();
54template <
class T> ARCCORE_EXPORT
void
58 if constexpr (
requires { t->_internalRemoveReference(); }) {
59 bool need_destroy = t->_internalRemoveReference();
101 ARCCORE_DEPRECATED_REASON(
"Y2025: use _internalAddReference() instead")
107 ARCCORE_DEPRECATED_REASON(
"Y2025: use _internalRemoveReference() instead")
108 void removeReference()
113 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
122 void _internalAddReference()
126 bool _internalRemoveReference()
131 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
142 delete m_external_deleter;
143 m_external_deleter = v;
147 return m_external_deleter;
152 std::atomic<Int32> m_nb_ref = 0;
160 if (!m_external_deleter)
162 bool do_delete =
false;
163 if (!m_external_deleter->m_no_destroy) {
164 bool is_destroyed = m_external_deleter->_destroyHandle(
this, m_external_deleter->m_handle);
169 delete m_external_deleter;
170 m_external_deleter =
nullptr;
181#define ARCCORE_INTERNAL_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS(OPTIONAL_OVERRIDE) \
184 using BaseCounterType = ::Arcane::ReferenceCounterImpl; \
188 BaseCounterType* _internalReferenceCounter() OPTIONAL_OVERRIDE \
192 void _internalAddReference() OPTIONAL_OVERRIDE \
194 BaseCounterType::_internalAddReference(); \
196 bool _internalRemoveReference() OPTIONAL_OVERRIDE \
198 return BaseCounterType::_internalRemoveReference(); \
223#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS() \
224 ARCCORE_INTERNAL_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS(override)
245#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name) \
246 template class ExternalReferenceCounterAccessor<class_name>
Définitions et globaux de Arccore.
Implémentation thread-safe d'un compteur de référence.
bool _destroyThisReference()
Retourne true si l'instance doit être détruite par l'appel à operator delete()
Wrapper autour d'une classe gérant son propre compteur de référence.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nom de Arccore.