Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
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
81 void allocate(Integer asize) override
82 {
83 m_services.resize(asize,nullptr);
84 m_services_reference.resize(asize);
85 }
86
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:
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/*---------------------------------------------------------------------------*/
128class ARCANE_CORE_EXPORT CaseOptionService
129{
130 public:
131
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 }
183 {
184 m_impl->setDefaultValue(def_value);
185 }
187 void addDefaultValue(const String& category,const String& value)
188 {
189 m_impl->addDefaultValue(category,value);
190 }
199 void setMeshName(const String& mesh_name);
200
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:
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/*---------------------------------------------------------------------------*/
261class ARCANE_CORE_EXPORT CaseOptionMultiService
262{
263 public:
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(); }
277 {
278 m_impl->getAvailableNames(names);
279 }
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 }
294 void setMeshName(const String& mesh_name);
295
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/*---------------------------------------------------------------------------*/
319template<typename InterfaceType>
322, public ArrayView<InterfaceType*>
323{
325 public:
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
Tableau d'items de types quelconques.
Informations pour construire une option de jeu de données.
Classe de base d'une option service pouvant être présente plusieurs fois.
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.
Classe de base de l'implémentation des options utilisant 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.
Classe de base d'une liste d'options du jeu de données.
Definition CaseOptions.h:57
Interface d'un conteneur d'instances de service.
Interface d'une liste d'options du jeu de données.
Fabrique pour un service implémentant l'interface InterfaceType.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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.
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 -*-