14#include "arcane/utils/ParameterList.h"
15#include "arcane/utils/StringDictionary.h"
16#include "arcane/utils/String.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/Ref.h"
21#include "arcane/utils/internal/ParameterOption.h"
22#include "arcane/utils/internal/ParameterListWithCaseOption.h"
53 return (v1.name == v2.name && v1.value == v2.value);
60 : m_parameter_option(
makeRef(new ParameterOptionElementsCollection()))
68 if (
const auto value = m_parameter_option->value(ParameterOptionAddr(key.
view().
subView(2))))
72 String x = m_parameters_dictionary.
find(key);
76 void addParameter(
const String& name,
const String& value)
82 if (name.startsWith(
"//")) {
83 m_parameters_option_list.add({ name, value });
84 m_parameter_option->addParameter(m_parameters_option_list[m_parameters_option_list.size() - 1].name, m_parameters_option_list[m_parameters_option_list.size() - 1].value);
88 m_parameters_dictionary.add(name, value);
89 m_parameters_list.add({ name, value });
90 m_parameter_option->addParameter(m_parameters_list[m_parameters_list.size() - 1].name, m_parameters_list[m_parameters_list.size() - 1].value);
93 void setParameter(
const String& name,
const String& value)
99 if (name.startsWith(
"//")) {
100 ARCANE_FATAL(
"Set parameter not supported for ParameterOptions.");
103 m_parameters_dictionary.add(name, value);
106 auto comparer = [=](
const NameValuePair& nv) {
return nv.name == name; };
107 auto new_end = std::remove_if(m_parameters_list.begin(), m_parameters_list.end(), comparer);
108 m_parameters_list.resize(new_end - m_parameters_list.begin());
111 void removeParameter(
const String& name,
const String& value)
116 if (name.startsWith(
"//")) {
117 ARCANE_FATAL(
"Remove parameter not supported for ParameterOptions.");
123 String x = m_parameters_dictionary.find(name);
124 bool need_fill =
false;
126 m_parameters_dictionary.remove(name);
132 auto new_end = std::remove(m_parameters_list.begin(), m_parameters_list.end(), ref_value);
133 m_parameters_list.resize(new_end - m_parameters_list.begin());
135 _fillDictionaryWithValueInList(name);
139 m_parameters_dictionary.fill(param_names, values);
140 for (
const auto& [name, value] : m_parameters_option_list) {
141 param_names.add(name);
143 std::cout <<
"FILL name='" << name <<
"' value='" << value <<
"'\n";
147 ParameterOptionElementsCollection* getParameterOption()
const
149 return m_parameter_option.get();
154 void _fillDictionaryWithValueInList(
const String& name)
156 for (
auto& nv : m_parameters_list)
158 m_parameters_dictionary.add(nv.name, nv.value);
163 StringDictionary m_parameters_dictionary;
164 UniqueArray<NameValuePair> m_parameters_list;
165 UniqueArray<NameValuePair> m_parameters_option_list;
166 Ref<ParameterOptionElementsCollection> m_parameter_option;
172ParameterListWithCaseOption::
173ParameterListWithCaseOption()
181ParameterListWithCaseOption::
182ParameterListWithCaseOption(
const ParameterListWithCaseOption& rhs)
183: m_p(new Impl(*rhs.m_p))
190ParameterListWithCaseOption::
191~ParameterListWithCaseOption()
199String ParameterListWithCaseOption::
200getParameterOrNull(
const String& param_name)
const
202 return m_p->getParameter(param_name);
208bool ParameterListWithCaseOption::
209addParameterLine(
const String& line)
211 Span<const Byte> bytes = line.bytes();
215 Byte cnext = ((i + 1) <
len) ? bytes[i + 1] :
'\0';
217 m_p->addParameter(line.substring(0, i), line.substring(i + 1));
220 if (c ==
'+' && cnext ==
'=') {
221 m_p->addParameter(line.substring(0, i), line.substring(i + 2));
224 if (c ==
':' && cnext ==
'=') {
225 m_p->setParameter(line.substring(0, i), line.substring(i + 2));
228 if (c ==
'-' && cnext ==
'=') {
229 m_p->removeParameter(line.substring(0, i), line.substring(i + 2));
239ParameterCaseOption ParameterListWithCaseOption::
240getParameterCaseOption(
const String& language)
const
242 return { m_p->getParameterOption(), language };
248void ParameterListWithCaseOption::
249addParameters(
const ParameterList& parameters)
254 parameters.fillParameters(names, values);
256 for (
Int32 i = 0; i < size; ++i)
257 m_p->addParameter(names[i], values[i]);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer count() const
Nombre d'éléments de la collection.
String find(const String &key, bool throw_exception=false) const
Retourne la valeur associée à key.
StringView subView(Int64 pos) const
Sous-chaîne commençant à la position pos.
Chaîne de caractères unicode.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
StringView view() const
Retourne une vue sur la chaîne actuelle.
Integer len(const char *s)
Retourne la longueur de la chaîne s.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
List< String > StringList
Tableau de chaînes de caractères unicode.
unsigned char Byte
Type d'un octet.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.