Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CaseOptionService.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* CaseOptionService.h (C) 2000-2019 */
9/* */
10/* Options du jeu de données utilisant un service. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CASEOPTIONSERVICE_H
13#define ARCANE_CASEOPTIONSERVICE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/Functor.h"
19
20#include "arcane/CaseOptions.h"
21#include "arcane/IServiceMng.h"
22#include "arcane/ISubDomain.h"
23#include "arcane/ServiceUtils.h"
24#include "arcane/ArcaneException.h"
25#include "arcane/IFactoryService.h"
26#include "arcane/IServiceFactory.h"
27#include "arcane/StringDictionary.h"
28#include "arcane/CaseOptionServiceImpl.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
39class IService;
40class CaseOptionBuildInfo;
41template<typename T> class CaseOptionServiceT;
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45/*!
46 * \brief Implémentation du conteneur pour un service de type \a InterfaceType.
47 */
48template<typename InterfaceType>
51{
52 public:
54 {
56 }
57
58 bool tryCreateService(Integer index,Internal::IServiceFactory2* factory,const ServiceBuildInfoBase& sbi) override
59 {
60 auto true_factory = dynamic_cast< Internal::IServiceFactory2T<InterfaceType>* >(factory);
61 if (true_factory){
62 Ref<InterfaceType> sr = true_factory->createServiceReference(sbi);
63 InterfaceType* s = sr.get();
64 m_services_reference[index] = sr;
65 m_services[index] = s;
66 return (s != nullptr);
67 }
68 return false;
69 }
70
71 bool hasInterfaceImplemented(Internal::IServiceFactory2* factory) const override
72 {
73 auto true_factory = dynamic_cast< Internal::IServiceFactory2T<InterfaceType>* >(factory);
74 if (true_factory){
75 return true;
76 }
77 return false;
78 }
79
80 //! Alloue un tableau pour \a size éléments
81 void allocate(Integer asize) override
82 {
83 m_services.resize(asize,nullptr);
84 m_services_reference.resize(asize);
85 }
86
87 //! Retourne le nombre d'éléments du tableau.
88 Integer nbElem() const override
89 {
90 return m_services.size();
91 }
92
93 InterfaceType* child(Integer i) const
94 {
95 return m_services[i];
96 }
97
98 Ref<InterfaceType> childRef(Integer i) const
99 {
100 return m_services_reference[i];
101 }
102
103 public:
104 //! Supprime les instances des services
106 {
107 m_services_reference.clear();
108 m_services.clear();
109 }
110 public:
111 ArrayView<InterfaceType*> view() { return m_services; }
112 private:
113 UniqueArray<InterfaceType*> m_services;
114 UniqueArray<Ref<InterfaceType>> m_services_reference;
115};
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122/*!
123 * \ingroup CaseOption
124 * \brief Classe de base des options utilisant des services.
125 *
126 * Les instances de cette classe ne sont pas copiables.
127 */
128class ARCANE_CORE_EXPORT CaseOptionService
129{
130 public:
131
132 CaseOptionService(const CaseOptionBuildInfo& cob,bool allow_null,bool is_optional)
133 : m_impl(new CaseOptionServiceImpl(cob,allow_null,is_optional))
134 {
135 }
136
137 virtual ~CaseOptionService() = default;
138
139 public:
140
141 CaseOptionService(const CaseOptionService&) = delete;
142 const CaseOptionService& operator=(const CaseOptionService&) = delete;
143
144 public:
145
146 ARCANE_DEPRECATED_REASON("Y2022: Use toICaseOptions() instead")
147 operator CaseOptions& () { return *_impl(); }
148
149 ARCANE_DEPRECATED_REASON("Y2022: Use toICaseOptions() instead")
150 operator const CaseOptions& () const { return *_impl(); }
151
152 public:
153
154 const ICaseOptions* toICaseOptions() { return _impl(); }
155
156 public:
157
158 String rootTagName() const { return m_impl->rootTagName(); }
159 String name() const { return m_impl->name(); }
160 String serviceName() const { return m_impl->serviceName(); }
161 bool isOptional() const { return m_impl->isOptional(); }
162 bool isPresent() const { return m_impl->isPresent(); }
163 void addAlternativeNodeName(const String& lang,const String& name)
164 {
165 m_impl->addAlternativeNodeName(lang,name);
166 }
167 void getAvailableNames(StringArray& names) const
168 {
169 m_impl->getAvailableNames(names);
170 }
171 /*!
172 * \brief Positionne la valeur par défaut du nom du service.
173 *
174 * Si l'option n'est pas pas présente dans le jeu de données, alors sa valeur sera
175 * celle spécifiée par l'argument \a def_value, sinon l'appel de cette méthode est sans effet.
176 *
177 * Cette méthode ne peut être apellée que lors de la phase 1 de la lecture
178 * du jeu de données car par la suite le service est déjà instancié. Une exception
179 * FatalErrorException est levé si cette méthode est appelée et que le service
180 * est déjà instancié.
181 */
182 void setDefaultValue(const String& def_value)
183 {
184 m_impl->setDefaultValue(def_value);
185 }
186 //! Ajoute la valeur par défaut \a value à la catégorie \a category
187 void addDefaultValue(const String& category,const String& value)
188 {
189 m_impl->addDefaultValue(category,value);
190 }
191 /*!
192 * \brief Positionne le nom du maillage auquel le service sera associé.
193 *
194 * Si nul, le service est associé au maillage par défaut du sous-domaine
195 * (ISubDomain::defaultMeshHandle()). L'association réelle se fait lors de la
196 * lecture des options. Appeler cette méthode après lecture des options n'aura
197 * aucun impact.
198 */
199 void setMeshName(const String& mesh_name);
200
201 /*!
202 * \brief Nom du maillage auquel le service est associé.
203 *
204 * Il s'agit du nom du maillage tel que spécifié dans le descripteur de service
205 * (le fichier 'axl'). Pour obtenir le maillage associé après lecture des options
206 * il faut utiliser ICaseOptions::meshHandle().
207 */
208 String meshName() const;
209
210 protected:
211
212 CaseOptionServiceImpl* _impl() { return m_impl.get(); }
213 const CaseOptionServiceImpl* _impl() const { return m_impl.get(); }
214
215 private:
216
217 ReferenceCounter<CaseOptionServiceImpl> m_impl;
218};
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
223template<class InterfaceType>
225: public CaseOptionService
226{
227 public:
228 CaseOptionServiceT(const CaseOptionBuildInfo& cob,bool allow_null,bool is_optional)
229 : CaseOptionService(cob,allow_null,is_optional)
230 {
231 _impl()->setContainer(&m_container);
232 }
233 ~CaseOptionServiceT() = default;
234 public:
235 InterfaceType* operator()() const { return _instance(); }
236 InterfaceType* instance() const { return _instance(); }
237 Ref<InterfaceType> instanceRef() const { return _instanceRef(); }
238 private:
240 private:
241 InterfaceType* _instance() const
242 {
243 if (m_container.nbElem()==1)
244 return m_container.child(0);
245 return nullptr;
246 }
247 Ref<InterfaceType> _instanceRef() const
248 {
249 if (m_container.nbElem()==1)
250 return m_container.childRef(0);
251 return {};
252 }
253};
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257/*!
258 * \ingroup CaseOption
259 * \brief Classe de base d'une option service pouvant être présente plusieurs fois.
260 */
261class ARCANE_CORE_EXPORT CaseOptionMultiService
262{
263 public:
264 CaseOptionMultiService(const CaseOptionBuildInfo& cob,bool allow_null)
265 : m_impl(new CaseOptionMultiServiceImpl(cob,allow_null))
266 {
267 }
268 virtual ~CaseOptionMultiService() = default;
270 const CaseOptionMultiService& operator=(const CaseOptionMultiService&) = delete;
271 public:
272 XmlNode rootElement() const { return m_impl->toCaseOptions()->configList()->rootElement(); }
273 String rootTagName() const { return m_impl->rootTagName(); }
274 String name() const { return m_impl->name(); }
275 //! Retourne dans \a names les noms d'implémentations valides pour ce service
277 {
278 m_impl->getAvailableNames(names);
279 }
280 //! Nom du n-ième service
281 String serviceName(Integer index) const
282 {
283 return m_impl->serviceName(index);
284 }
285 void addAlternativeNodeName(const String& lang,const String& name)
286 {
287 m_impl->addAlternativeNodeName(lang,name);
288 }
289 /*!
290 * \brief Positionne le nom du maillage auquel le service sera associé.
291 *
292 * \sa CaseOptionService::setMeshName()
293 */
294 void setMeshName(const String& mesh_name);
295
296 /*!
297 * \brief Nom du maillage auquel le service est associé.
298 *
299 * \sa CaseOptionService::axlMeshName();
300 */
301 String meshName() const;
302
303 protected:
304
305 CaseOptionMultiServiceImpl* _impl() { return m_impl.get(); }
306 const CaseOptionMultiServiceImpl* _impl() const { return m_impl.get(); }
307
308 private:
309
310 ReferenceCounter<CaseOptionMultiServiceImpl> m_impl;
311};
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315/*!
316 * \ingroup CaseOption
317 * \brief Option du jeu de données de type liste de services.
318 */
319template<typename InterfaceType>
322, public ArrayView<InterfaceType*>
323{
325 public:
326 CaseOptionMultiServiceT(const CaseOptionBuildInfo& cob,bool allow_null)
327 : CaseOptionMultiService(cob,allow_null)
328 , m_notify_functor(this,&ThatClass::_notify)
329 {
330 _impl()->setContainer(&m_container);
331 _impl()->_setNotifyAllocateFunctor(&m_notify_functor);
332 }
333 public:
335 {
336 return *this;
337 }
338 const CaseOptionMultiServiceT<InterfaceType>& operator()() const
339 {
340 return *this;
341 }
342 protected:
343 // Notification par l'implémentation
344 void _notify()
345 {
346 this->setArray(m_container.view());
347 }
348 private:
350 FunctorT<ThatClass> m_notify_functor;
351};
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355
356} // End namespace Arcane
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
361#endif
void setContainer(ICaseOptionServiceContainer *container)
Positionne le conteneur d'instances.
Option du jeu de données de type liste de services.
Classe de base d'une option service pouvant être présente plusieurs fois.
void getAvailableNames(StringArray &names) const
Retourne dans names les noms d'implémentations valides pour ce service.
String serviceName(Integer index) const
Nom du n-ième service.
Implémentation du conteneur pour un service de type InterfaceType.
void allocate(Integer asize) override
Alloue un tableau pour size éléments.
Integer nbElem() const override
Retourne le nombre d'éléments du tableau.
void removeInstances()
Supprime les instances des services.
void setContainer(ICaseOptionServiceContainer *container)
Positionne le conteneur d'instances.
Classe de base des options utilisant des services.
void addDefaultValue(const String &category, const String &value)
Ajoute la valeur par défaut value à la catégorie category.
void setDefaultValue(const String &def_value)
Positionne la valeur par défaut du nom du service.
Interface d'un conteneur d'instances de service.
Informations pour créer un service.
Noeud d'un arbre DOM.
Definition XmlNode.h:51
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void clear()
Supprime les éléments du tableau.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-