Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshHandle.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/* MeshHandle.h (C) 2000-2023 */
9/* */
10/* Handle sur un maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESHHANDLE_H
13#define ARCANE_MESHHANDLE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arccore/base/StringView.h"
19#include "arccore/base/String.h"
20
22#include "arcane/ArcaneTypes.h"
23
24#include <atomic>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34/*!
35 * \brief Handle sur un maillage.
36 *
37 * Cette classe utilise la sémantique d'un compteur de référence.
38 *
39 * Cette classe permet de gérer une référence à un maillage (IMesh) avant
40 * qu'il ne soit explicitement créé. Cela permet aux services et modules
41 * de spécifier lors de leur construction à quel maillage ils font référence.
42 *
43 * Elle permet aussi d'associer des données utilisateurs au maillage
44 * via meshUserDataList().
45 */
46class ARCANE_CORE_EXPORT MeshHandle
47{
48 private:
49
50 // Temporaire: pour accéder au constructeur qui utilise ISubDomain.
51 friend class MeshMng;
52
53 private:
54
55 class MeshHandleRef
57 {
58 public:
59
60 MeshHandleRef()
61 : m_is_null(true)
62 {}
63 MeshHandleRef(ISubDomain* sd, const String& name);
64 ~MeshHandleRef();
65
66 public:
67
68 const String& meshName() const { return m_mesh_name; }
69 bool isNull() const { return m_is_null; }
70 IMesh* mesh() const { return m_mesh_ptr; }
71 IMeshBase* meshBase() const { return m_mesh_base_ptr; }
72 ISubDomain* subDomain() const { return m_sub_domain; }
73 IMeshMng* meshMng() const { return m_mesh_mng; }
74 ITraceMng* traceMng() const { return m_trace_mng; }
75 IVariableMng* variableMng() const { return m_variable_mng; }
76 IUserDataList* userDataList() const { return m_user_data_list; }
77 Observable* onDestroyObservable() const { return m_on_destroy_observable; }
78 bool isDoFatalInMeshMethod() const { return m_do_fatal_in_mesh_method; }
79
80 public:
81
82 void _destroyMesh();
83 void _setMesh(IMesh* mesh);
84
85 private:
86
87 String m_mesh_name;
88 IMesh* m_mesh_ptr = nullptr;
89 IMeshBase* m_mesh_base_ptr = nullptr;
90 // Pour l'instant on en a besoin mais il faudrait le supprimer
91 ISubDomain* m_sub_domain = nullptr;
92 IUserDataList* m_user_data_list = nullptr;
93 IMeshMng* m_mesh_mng = nullptr;
94 ITraceMng* m_trace_mng = nullptr;
95 IVariableMng* m_variable_mng = nullptr;
96 Observable* m_on_destroy_observable = nullptr;
97 bool m_is_null = true;
98 bool m_do_fatal_in_mesh_method = false;
99 };
100
101 public:
102
103 MeshHandle();
104
105 private:
106
107 // TODO rendre accessible uniquement aux classes implémentant IMeshMng.
108 MeshHandle(ISubDomain* sd, const String& name);
109
110 public:
111
112 /*!
113 * \brief Maillage associé.
114 *
115 * Il est interdit d'appeler cette méthode si le maillage n'a pas encore été
116 * créé. A terme, une exception sera levée dans ce cas.
117 *
118 * Si on n'est pas certain que le maillage existe, on peut tester son
119 * existence via hasMesh().
120 *
121 * \pre hasMesh() == true
122 */
123 IMesh* mesh() const;
124
125 //! Indique si le maillage associé a déjà été créé (i.e: mesh() est valide)
126 bool hasMesh() const;
127
128 /*!
129 * \brief Retourne le maillage associé à cette instance.
130 *
131 * Contrairement à mesh(), cette peut-être appelée si le maillage associé n'a pas
132 * encore été créé. Dans ce cas on retourne un pointeur nul.
133 */
134 IMesh* meshOrNull() const;
135
136 public:
137
138 //! Sous-domaine associé. Null si isNull() est vrai.
139 ARCCORE_DEPRECATED_2020("Do not use this method. Try to get ISubDomain from another way")
140 ISubDomain* subDomain() const { return m_ref->subDomain(); }
141
142 public:
143
144 //! Gestionnaire de maillage associé. nullptr si isNull() est vrai.
145 IMeshMng* meshMng() const;
146
147 //! Gestionnaire de trace associé. nullptr si isNull() est vrai.
148 ITraceMng* traceMng() const;
149
150 //! Gestionnaire de variable associé. nullptr si isNull() est vrai.
151 IVariableMng* variableMng() const;
152
153 //! Application associée. nullptr si isNull() est vrai.
154 IApplication* application() const;
155
156 //! Données utilisateurs associées
157 IUserDataList* meshUserDataList() const { return m_ref->userDataList(); }
158
159 const String& meshName() const { return m_ref->meshName(); }
160
161 //! Indique si le handle est nul (il ne référence aucun maillage existant ou non)
162 bool isNull() const { return m_ref->isNull(); }
163
164 //! Observable pour être notifié de la destruction
165 IObservable* onDestroyObservable() const;
166
167 //! \internal
168 const void* reference() const { return m_ref.get(); }
169
170 public:
171
172 //! \internal
173 void _setMesh(IMesh* mesh) { m_ref->_setMesh(mesh); }
174
175 //! \internal
176 void _destroyMesh() { m_ref->_destroyMesh(); }
177
178 //! \internal
179 IMesh* _internalMeshOrNull() const { return m_ref->mesh(); }
180
181 private:
182
184};
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188/*!
189 * \brief Classe de compatibilité pour contenir un MeshHandle ou un IMesh*.
190 *
191 * A terme les constructeurs et convertisseurs vers IMesh* seront supprimés
192 */
193class ARCANE_CORE_EXPORT MeshHandleOrMesh
194{
195 public:
196
197 // NOTE: Les constructeurs ne doivent pas être explicites
198 // pour autoriser les conversions
199
200 //! Construit une instance à partir d'un MeshHandle
201 MeshHandleOrMesh(const MeshHandle& handle);
202
203 /*!
204 * \brief Construit une instance à partir d'un IMesh*.
205 *
206 * Si \a mesh est nul, le MeshHandle associé sera aussi nul.
207 */
208 MeshHandleOrMesh(IMesh* mesh);
209
210 //! Maillage associé. Peut être nul si le maillage n'a pas encore été créé
211 IMesh* mesh() const { return m_handle.meshOrNull(); }
212
213 //! Maillage associé. Peut être nul si le maillage n'a pas encore été créé
214 operator IMesh*() const { return mesh(); }
215
216 //! handle associé.
217 const MeshHandle& handle() const { return m_handle; }
218
219 private:
220
221 MeshHandle m_handle;
222};
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
227} // End namespace Arcane
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
232#endif
Déclarations des types utilisés dans Arcane.
Interface de l'application.
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
Interface d'un observable.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface d'une liste qui gère des données utilisateurs.
Interface du gestionnaire de variables.
Classe de compatibilité pour contenir un MeshHandle ou un IMesh*.
Definition MeshHandle.h:194
IMesh * mesh() const
Maillage associé. Peut être nul si le maillage n'a pas encore été créé
Definition MeshHandle.h:211
const MeshHandle & handle() const
handle associé.
Definition MeshHandle.h:217
Handle sur un maillage.
Definition MeshHandle.h:47
bool isNull() const
Indique si le handle est nul (il ne référence aucun maillage existant ou non)
Definition MeshHandle.h:162
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
Definition MeshHandle.h:157
Classe de base d'un observable.
Interface du gestionnaire de traces.
Implémentation thread-safe d'un compteur de référence.
Encapsulation d'un pointeur avec compteur de référence.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-