Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParameterListWithCaseOption.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* ParameterListWithCaseOption.cc (C) 2000-2025 */
9/* */
10/* Liste de paramètres avec support pour les options du jeu de données. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
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"
20
21#include "arcane/utils/internal/ParameterOption.h"
22#include "arcane/utils/internal/ParameterListWithCaseOption.h"
23
24#include <algorithm>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*
29 * Cette classe gère les paramètres de la ligne de commande qui permettent
30 * de surcharger les options du jeu de données.
31 *
32 * Il s'agit d'une copie de la classe ParameterList.
33 *
34 * TODO: il ne faudrait conserver dans cette classe que les options
35 * qui commencent par '//' et qui sont liées au jeu de données.
36 */
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
44{
45 public:
46
48 {
49 String name;
50 String value;
51 friend bool operator==(const NameValuePair& v1, const NameValuePair& v2)
52 {
53 return (v1.name == v2.name && v1.value == v2.value);
54 }
55 };
56
57 public:
58
59 Impl()
60 : m_parameter_option(makeRef(new ParameterOptionElementsCollection()))
61 {}
62
63 public:
64
65 String getParameter(const String& key)
66 {
67 if (key.startsWith("//")) {
68 if (const auto value = m_parameter_option->value(ParameterOptionAddr(key.view().subView(2))))
69 return value.value();
70 return {};
71 }
72 String x = m_parameters_dictionary.find(key);
73 return x;
74 }
75
76 void addParameter(const String& name, const String& value)
77 {
78 //std::cout << "__ADD_PARAMETER name='" << name << "' v='" << value << "'\n";
79 if (name.empty())
80 return;
81
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);
85 return;
86 }
87
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);
91 }
92
93 void setParameter(const String& name, const String& value)
94 {
95 //std::cout << "__SET_PARAMETER name='" << name << "' v='" << value << "'\n";
96 if (name.empty())
97 return;
98
99 if (name.startsWith("//")) {
100 ARCANE_FATAL("Set parameter not supported for ParameterOptions.");
101 }
102
103 m_parameters_dictionary.add(name, value);
104 // Supprime de la liste toutes les occurences ayant
105 // pour paramètre \a name
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());
109 }
110
111 void removeParameter(const String& name, const String& value)
112 {
113 //std::cout << "__REMOVE_PARAMETER name='" << name << "' v='" << value << "'\n";
114 if (name.empty())
115 return;
116 if (name.startsWith("//")) {
117 ARCANE_FATAL("Remove parameter not supported for ParameterOptions.");
118 }
119 // Si le paramètre \a name avec la valeur \a value est trouvé, le supprime.
120 // Dans ce cas, il faudra regarder s'il y a toujours
121 // dans \a m_parameters_list un paramètre \a name et si c'est le
122 // cas c'est la valeur de celui-là qu'on prendra
123 String x = m_parameters_dictionary.find(name);
124 bool need_fill = false;
125 if (x == value) {
126 m_parameters_dictionary.remove(name);
127 need_fill = true;
128 }
129 // Supprime de la liste toutes les occurences
130 // du paramètre avec la valeur souhaitée
131 NameValuePair ref_value{ name, value };
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());
134 if (need_fill)
135 _fillDictionaryWithValueInList(name);
136 }
137 void fillParameters(StringList& param_names, StringList& values) const
138 {
139 m_parameters_dictionary.fill(param_names, values);
140 for (const auto& [name, value] : m_parameters_option_list) {
141 param_names.add(name);
142 values.add(value);
143 std::cout << "FILL name='" << name << "' value='" << value << "'\n";
144 }
145 }
146
147 ParameterOptionElementsCollection* getParameterOption() const
148 {
149 return m_parameter_option.get();
150 }
151
152 private:
153
154 void _fillDictionaryWithValueInList(const String& name)
155 {
156 for (auto& nv : m_parameters_list)
157 if (nv.name == name)
158 m_parameters_dictionary.add(nv.name, nv.value);
159 }
160
161 private:
162
163 StringDictionary m_parameters_dictionary;
164 UniqueArray<NameValuePair> m_parameters_list;
165 UniqueArray<NameValuePair> m_parameters_option_list;
166 Ref<ParameterOptionElementsCollection> m_parameter_option;
167};
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
200getParameterOrNull(const String& param_name) const
201{
202 return m_p->getParameter(param_name);
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
209addParameterLine(const String& line)
210{
211 Span<const Byte> bytes = line.bytes();
212 Int64 len = bytes.length();
213 for (Int64 i = 0; i < len; ++i) {
214 Byte c = bytes[i];
215 Byte cnext = ((i + 1) < len) ? bytes[i + 1] : '\0';
216 if (c == '=') {
217 m_p->addParameter(line.substring(0, i), line.substring(i + 1));
218 return false;
219 }
220 if (c == '+' && cnext == '=') {
221 m_p->addParameter(line.substring(0, i), line.substring(i + 2));
222 return false;
223 }
224 if (c == ':' && cnext == '=') {
225 m_p->setParameter(line.substring(0, i), line.substring(i + 2));
226 return false;
227 }
228 if (c == '-' && cnext == '=') {
229 m_p->removeParameter(line.substring(0, i), line.substring(i + 2));
230 return false;
231 }
232 }
233 return true;
234}
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
240getParameterCaseOption(const String& language) const
241{
242 return { m_p->getParameterOption(), language };
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
249addParameters(const ParameterList& parameters)
250{
251 // TODO: ne prendre en compte que les options qui commencent par '//'
252 StringList names;
253 StringList values;
254 parameters.fillParameters(names, values);
255 Int32 size = names.count();
256 for (Int32 i = 0; i < size; ++i)
257 m_p->addParameter(names[i], values[i]);
258}
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
263} // End namespace Arcane
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer count() const
Nombre d'éléments de la collection.
Classe représentant l'ensemble des paramètres pouvant modifier les options du jeu de données.
bool addParameterLine(const String &line)
Analyse la ligne line.
ParameterListWithCaseOption()
Construit un dictionnaire.
void addParameters(const ParameterList &parameters)
Ajoute les paramètres de parameters aux paramètres de l'instance.
ParameterCaseOption getParameterCaseOption(const String &language) const
Méthode permettant de récupérer un objet de type ParameterCaseOption.
String getParameterOrNull(const String &param_name) const
Récupère le paramètre de nom param_name.
void fillParameters(StringList &param_names, StringList &values) const
Récupère la liste des paramètres et leur valeur.
Classe représentant une adresse d'option du jeu de données. Cette adresse doit être de la forme : "ta...
Classe représentant un ensemble d'éléments XML (un ensemble d'options Arcane).
constexpr __host__ __device__ SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:333
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
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.
Definition StringView.cc:37
Chaîne de caractères unicode.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
Definition String.cc:1100
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:292
StringView view() const
Retourne une vue sur la chaîne actuelle.
Definition String.cc:368
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
Definition String.cc:1115
-*- 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.
Definition UtilsTypes.h:513
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.