12#ifndef ARCANE_CORE_CASEOPTIONSERVICE_H
13#define ARCANE_CORE_CASEOPTIONSERVICE_H
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/Functor.h"
20#include "arcane/core/CaseOptions.h"
21#include "arcane/core/IServiceMng.h"
22#include "arcane/core/ISubDomain.h"
23#include "arcane/core/ServiceUtils.h"
24#include "arcane/core/ArcaneException.h"
25#include "arcane/core/IFactoryService.h"
26#include "arcane/core/IServiceFactory.h"
27#include "arcane/core/StringDictionary.h"
28#include "arcane/core/CaseOptionServiceImpl.h"
49template <
typename InterfaceType>
65 InterfaceType* s = sr.
get();
66 m_services_reference[index] = sr;
67 m_services[index] = s;
68 return (s !=
nullptr);
85 m_services.resize(asize,
nullptr);
86 m_services_reference.resize(asize);
92 return m_services.size();
95 InterfaceType* child(
Integer i)
const
100 Ref<InterfaceType> childRef(
Integer i)
const
102 return m_services_reference[i];
110 m_services_reference.clear();
120 UniqueArray<InterfaceType*> m_services;
121 UniqueArray<Ref<InterfaceType>> m_services_reference;
136class ARCANE_CORE_EXPORT CaseOptionService
145 virtual ~CaseOptionService() =
default;
149 CaseOptionService(
const CaseOptionService&) =
delete;
150 const CaseOptionService& operator=(
const CaseOptionService&) =
delete;
154 ARCANE_DEPRECATED_REASON(
"Y2022: Use toICaseOptions() instead")
157 ARCANE_DEPRECATED_REASON(
"Y2022: Use toICaseOptions() instead")
158 operator const CaseOptions&()
const {
return *_impl(); }
162 const ICaseOptions* toICaseOptions() {
return _impl(); }
166 String rootTagName()
const {
return m_impl->rootTagName(); }
167 String name()
const {
return m_impl->name(); }
168 String serviceName()
const {
return m_impl->serviceName(); }
169 bool isOptional()
const {
return m_impl->isOptional(); }
170 bool isPresent()
const {
return m_impl->isPresent(); }
171 void addAlternativeNodeName(
const String& lang,
const String& name)
173 m_impl->addAlternativeNodeName(lang, name);
177 m_impl->getAvailableNames(names);
194 m_impl->setDefaultValue(def_value);
200 m_impl->addDefaultValue(category, value);
211 void setMeshName(
const String& mesh_name);
225 const CaseOptionServiceImpl* _impl()
const {
return m_impl.get(); }
229 ReferenceCounter<CaseOptionServiceImpl> m_impl;
235template <
class InterfaceType>
236class CaseOptionServiceT
237:
public CaseOptionService
242 : CaseOptionService(cob, allow_null, is_optional)
244 _impl()->setContainer(&m_container);
246 ~CaseOptionServiceT() =
default;
250 InterfaceType* operator()()
const {
return _instance(); }
251 InterfaceType* instance()
const {
return _instance(); }
260 InterfaceType* _instance()
const
262 if (m_container.nbElem() == 1)
263 return m_container.child(0);
268 if (m_container.nbElem() == 1)
269 return m_container.childRef(0);
281class ARCANE_CORE_EXPORT CaseOptionMultiService
289 virtual ~CaseOptionMultiService() =
default;
290 CaseOptionMultiService(
const CaseOptionMultiService&) =
delete;
291 const CaseOptionMultiService& operator=(
const CaseOptionMultiService&) =
delete;
295 XmlNode rootElement()
const {
return m_impl->toCaseOptions()->configList()->rootElement(); }
296 String rootTagName()
const {
return m_impl->rootTagName(); }
297 String name()
const {
return m_impl->name(); }
301 m_impl->getAvailableNames(names);
306 return m_impl->serviceName(index);
308 void addAlternativeNodeName(
const String& lang,
const String& name)
310 m_impl->addAlternativeNodeName(lang, name);
317 void setMeshName(
const String& mesh_name);
324 String meshName()
const;
328 CaseOptionMultiServiceImpl* _impl() {
return m_impl.get(); }
329 const CaseOptionMultiServiceImpl* _impl()
const {
return m_impl.get(); }
333 ReferenceCounter<CaseOptionMultiServiceImpl> m_impl;
343template <
typename InterfaceType>
344class CaseOptionMultiServiceT
345:
public CaseOptionMultiService
348 typedef CaseOptionMultiServiceT<InterfaceType> ThatClass;
353 : CaseOptionMultiService(cob, allow_null)
354 , m_notify_functor(
this, &ThatClass::_notify)
356 _impl()->setContainer(&m_container);
357 _impl()->_setNotifyAllocateFunctor(&m_notify_functor);
362 CaseOptionMultiServiceT<InterfaceType>& operator()()
366 const CaseOptionMultiServiceT<InterfaceType>& operator()()
const
376 this->setArray(m_container.view());
Modifiable view of an array of type T.
Information for building a dataset option.
Base class for a service option that can appear multiple times.
void getAvailableNames(StringArray &names) const
Returns the valid implementation names for this service in names.
String serviceName(Integer index) const
Name of the n-th service.
Implementation of the container for a service of type InterfaceType.
void allocate(Integer asize) override
Allocates an array for size elements.
Integer nbElem() const override
Returns the number of elements in the array.
void removeInstances()
Removes service instances.
Base class for implementing options using services.
void addDefaultValue(const String &category, const String &value)
Adds the default value value to the category category.
void setDefaultValue(const String &def_value)
Sets the default value for the service name.
Base class for a data set options list.
Functor associated with a method of a class T.
Interface of a service instance container.
Interface for a list of data set options.
Factory for a service implementing the InterfaceType interface.
InstanceType * get() const
Associated instance or nullptr if none.
Reference to an instance.
Information for creating a service.
Unicode character string.
constexpr ArrayView() noexcept
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Array< String > StringArray
Dynamic one-dimensional array of strings.
Int32 Integer
Type representing an integer.