Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ReferenceCounter.h
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/* ReferenceCounter.h (C) 2000-2025 */
9/* */
10/* Encapsulation d'un pointeur avec compteur de référence. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_REFERENCECOUNTER_H
13#define ARCCORE_BASE_REFERENCECOUNTER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/CheckedPointer.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
42template<class T>
44: public CheckedPointer<T>
45{
46 public:
47
50
52
53 public:
54
58 explicit ReferenceCounter(T* t) : BaseClass(nullptr) { _changeValue(t); }
61 : BaseClass(nullptr) { _changeValue(from.m_value); }
62
65 {
67 return (*this);
68 }
69
72 {
73 _changeValue(new_value);
74 return (*this);
75 }
76
79
80 private:
81
84 {
85 if (m_value)
86 ReferenceCounterAccessor<T>::removeReference(m_value);
87 }
88
89 void _changeValue(T* new_value)
90 {
91 if (m_value==new_value)
92 return;
93 // Toujours ajouter avant pour le cas où la nouvelle valeur
94 // et l'ancienne seraient issues de la même instance.
95 if (new_value)
96 ReferenceCounterAccessor<T>::addReference(new_value);
97 _removeRef();
98 m_value = new_value;
99 }
100};
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105} // End namespace Arccore
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110#endif
111
T * m_value
Pointeur sur l'objet référencé
CheckedPointer(const CheckedPointer< T > &from)
Construit une référence référant from.
ReferenceCounter(const ReferenceCounter< T > &from)
Construit une référence référant from.
void _removeRef()
Supprimer une référence à l'objet encapsulé si non nul.
CheckedPointer< IModuleFactoryInfo > BaseClass
ReferenceCounter(T *t)
Construit une instance référant t.
~ReferenceCounter()
Destructeur. Décrément le compteur de référence de l'objet pointé
T * m_value
Pointeur sur l'objet référencé
void _changeValue(T *new_value)
Change l'objet référencé en new_value.
ReferenceCounter()
Construit une instance sans référence.
ReferenceCounter< T > & operator=(T *new_value)
Affecte à l'instance la value new_value.
ReferenceCounter< T > & operator=(const ReferenceCounter< T > &from)
Opérateur de copie.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-