Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ReferenceCounter.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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-2023 */
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 Arccore
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*!
29 * \brief Encapsulation d'un pointeur avec compteur de référence.
30 *
31 * Cette classe renferme un pointeur d'un type qui doit implémenter
32 * les méthodes suivantes:
33 * - addReference() pour ajouter une référence
34 * - removeReference() pour supprimer une référence.
35 *
36 * A la différence de std::shared_ptr, le compteur de référence est donc géré
37 * en interne par le type *T*.
38 * Cette classe n'effectue aucune action basée sur la valeur de compteur de référence.
39 * la destruction éventuelle de l'objet lorsque le compteur de référence arrive
40 * à zéro est gérée par l'objet lui même.
41 */
42template<class T>
44: public CheckedPointer<T>
45{
46 public:
47
48 //! Type de la classe de base
50
52
53 public:
54
55 //! Construit une instance sans référence
57 //! Construit une instance référant \a t
58 explicit ReferenceCounter(T* t) : BaseClass(nullptr) { _changeValue(t); }
59 //! Construit une référence référant \a from
61 : BaseClass(nullptr) { _changeValue(from.m_value); }
62
63 //! Opérateur de copie
65 {
66 _changeValue(from.m_value);
67 return (*this);
68 }
69
70 //! Affecte à l'instance la value \a new_value
72 {
73 _changeValue(new_value);
74 return (*this);
75 }
76
77 //! Destructeur. Décrément le compteur de référence de l'objet pointé
78 ~ReferenceCounter() { _removeRef(); }
79
80 private:
81
82 //! Supprimer une référence à l'objet encapsulé si non nul
83 void _removeRef()
84 {
85 if (m_value)
87 }
88 //! Change l'objet référencé en \a new_value
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
Encapsulation d'un pointeur.
T * m_value
Pointeur sur l'objet référencé
Accesseur des méthodes de gestion de compteurs de référence.
Encapsulation d'un pointeur avec compteur de référence.
CheckedPointer< T > BaseClass
Type de la classe de base.
~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é
ReferenceCounter()
Construit une instance sans référence.
ReferenceCounter(const ReferenceCounter< T > &from)
Construit une référence référant from.
ReferenceCounter< T > & operator=(const ReferenceCounter< T > &from)
Opérateur de copie.
ReferenceCounter(T *t)
Construit une instance référant t.
ReferenceCounter< T > & operator=(T *new_value)
Affecte à l'instance la value new_value.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24