Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Ptr.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* Ptr.h (C) 2000-2024 */
9/* */
10/* Classes diverses encapsulant des pointeurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_PTR_H
13#define ARCANE_UTILS_PTR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \ingroup Core
29 * \brief Encapsulation d'un pointeur.
30 *
31 * Cette classe ne fait rien de particulier si ce n'est encapsulé un
32 * pointeur d'un type quelconque. Elle sert de classe de base à d'autres
33 * classes qui fournissent des fonctionnalités plus évoluées comme AutoRefT.
34 *
35 * Afin d'éviter des copies malencontreuses, le constructeur de copie et
36 * les opérateurs de copie sont protégés.
37 *
38 * En mode débug, vérifie qu'on accède pas à un pointeur nul.
39 *
40 * Le paramètre template n'a pas besoin d'être défini. Cette classe peut donc
41 * être instanciée pour un type opaque.
42 */
43template <class T>
44class PtrT
45{
46 protected:
48 //! Opérateur de copie
50 {
51 m_value = from.m_value;
52 return (*this);
53 }
54
55 template <typename T2>
56 PtrT<T>& operator=(const PtrT<T2>& from)
57 {
58 m_value = from.get();
59 return (*this);
60 }
61
62 //! Affecte à l'instance la value \a new_value
63 PtrT<T>& operator=(T* new_value)
64 {
65 m_value = new_value;
66 return (*this);
67 }
68
69 //! Construit une référence référant \a from
70 PtrT(const PtrT<T>& from)
71 : m_value(from.m_value)
72 {}
73
74 //! Construit une référence référant \a from
75 template <typename T2>
76 PtrT(const PtrT<T2>& from)
77 : m_value(from.m_value)
78 {}
79
80 public:
81
82 //! Construit une instance sans référence
83 PtrT() = default;
84
85 //! Construit une instance référant \a t
86 explicit PtrT(T* t)
87 : m_value(t)
88 {}
89
90 virtual ~PtrT() = default;
91
92 public:
93 public:
94
95 //! Retourne l'objet référé par l'instance
96 inline T* operator->() const
97 {
98#ifdef ARCANE_CHECK
99 if (!m_value)
101#endif
102 return m_value;
103 }
104
105 //! Retourne l'objet référé par l'instance
106 inline T& operator*() const
107 {
108#ifdef ARCANE_CHECK
109 if (!m_value)
111#endif
112 return *m_value;
113 }
114
115 /*!
116 * \brief Retourne l'objet référé par l'instance
117 *
118 * \warning En général, il faut être prudent lorsqu'on utilise cette
119 * fonction et ne pas conservé le pointeur retourné.
120 */
121 T* get() const { return m_value; }
122
123 bool isNull() const { return !m_value; }
124
125 protected:
126
127 T* m_value = nullptr; //!< Pointeur sur l'objet référencé
128};
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132/*!
133 * \brief Compare les objets référencés par \a v1 et \a v2
134 *
135 * La comparaison se fait pointeur par pointeur.
136 * \retval true s'ils sont égaux
137 * \retval false sinon
138 */
139template <typename T1, typename T2> inline bool
140operator==(const PtrT<T1>& v1, const PtrT<T2>& v2)
141{
142 return v1.get() == v2.get();
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148/*!
149 * \brief Compare les objets référencés par \a v1 et \a v2
150 * La comparaison se fait pointeur par pointeur.
151 * \retval false s'ils sont égaux
152 * \retval true sinon
153 */
154template <typename T1, typename T2> inline bool
155operator!=(const PtrT<T1>& v1, const PtrT<T2>& v2)
156{
157 return v1.get() != v2.get();
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
163} // namespace Arcane
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168#endif
Fichier de configuration d'Arcane.
Encapsulation d'un pointeur.
Definition Ptr.h:45
T * m_value
Pointeur sur l'objet référencé
Definition Ptr.h:127
T * operator->() const
Retourne l'objet référé par l'instance.
Definition Ptr.h:96
PtrT< T > & operator=(const PtrT< T > &from)
Opérateur de copie.
Definition Ptr.h:49
PtrT(const PtrT< T > &from)
Construit une référence référant from.
Definition Ptr.h:70
T * get() const
Retourne l'objet référé par l'instance.
Definition Ptr.h:121
PtrT()=default
Construit une instance sans référence.
PtrT(const PtrT< T2 > &from)
Construit une référence référant from.
Definition Ptr.h:76
PtrT< T > & operator=(T *new_value)
Affecte à l'instance la value new_value.
Definition Ptr.h:63
T & operator*() const
Retourne l'objet référé par l'instance.
Definition Ptr.h:106
PtrT(T *t)
Construit une instance référant t.
Definition Ptr.h:86
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void arcaneNullPointerError()
Signalue l'utilisation d'un pointeur nul.