12#ifndef ARCCORE_BASE_REFERENCECOUNTERIMPL_H
13#define ARCCORE_BASE_REFERENCECOUNTERIMPL_H
18#include "arccore/base/ReferenceCounter.h"
19#include "arccore/base/RefBase.h"
43template <
class T> ARCCORE_EXPORT
void
47 if constexpr (
requires { t->_internalAddReference(); })
48 t->_internalAddReference();
56template <
class T> ARCCORE_EXPORT
void
60 if constexpr (
requires { t->_internalRemoveReference(); }) {
61 bool need_destroy = t->_internalRemoveReference();
104 ARCCORE_DEPRECATED_REASON(
"Y2025: use _internalAddReference() instead")
110 ARCCORE_DEPRECATED_REASON(
"Y2025: use _internalRemoveReference() instead")
111 void removeReference()
116 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
125 void _internalAddReference()
129 bool _internalRemoveReference()
134 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
145 delete m_external_deleter;
146 m_external_deleter = v;
150 return m_external_deleter;
155 std::atomic<Int32> m_nb_ref = 0;
163 if (!m_external_deleter)
165 bool do_delete =
false;
166 if (!m_external_deleter->m_no_destroy) {
167 bool is_destroyed = m_external_deleter->_destroyHandle(
this, m_external_deleter->m_handle);
172 delete m_external_deleter;
173 m_external_deleter =
nullptr;
185#define ARCCORE_INTERNAL_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS(OPTIONAL_OVERRIDE) \
188 using BaseCounterType = ::Arcane::ReferenceCounterImpl; \
192 BaseCounterType* _internalReferenceCounter() OPTIONAL_OVERRIDE \
196 void _internalAddReference() OPTIONAL_OVERRIDE \
198 BaseCounterType::_internalAddReference(); \
200 bool _internalRemoveReference() OPTIONAL_OVERRIDE \
202 return BaseCounterType::_internalRemoveReference(); \
228#define ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS() \
229 ARCCORE_INTERNAL_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS(override)
250#define ARCCORE_DEFINE_REFERENCE_COUNTED_CLASS(class_name) \
251 template class ExternalReferenceCounterAccessor<class_name>
Definitions and globals of Arccore.
Thread-safe implementation of a reference counter.
bool _destroyThisReference()
Returns true if the instance must be destroyed by calling operator delete().
Wrapper around a class managing its own reference counter.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int32_t Int32
Signed integer type of 32 bits.