Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ParameterList.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/* ParameterList.cc (C) 2000-2025 */
9/* */
10/* Liste de paramêtres. */
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
23#include <algorithm>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
35{
36 public:
38 {
39 String name;
40 String value;
41 friend bool operator==(const NameValuePair& v1,const NameValuePair& v2)
42 {
43 return (v1.name==v2.name && v1.value==v2.value);
44 }
45 };
46 public:
47
48 Impl()
49 : m_parameter_option(makeRef(new ParameterOptionElementsCollection()))
50 {}
51
52 public:
53 String getParameter(const String& key)
54 {
55 if (key.startsWith("//")) {
56 if (const auto value = m_parameter_option->value(ParameterOptionAddr(key.view().subView(2))))
57 return value.value();
58 return {};
59 }
60 String x = m_parameters_dictionary.find(key);
61 return x;
62 }
63
64 void addParameter(const String& name,const String& value)
65 {
66 //std::cout << "__ADD_PARAMETER name='" << name << "' v='" << value << "'\n";
67 if (name.empty())
68 return;
69
70 if (name.startsWith("//")) {
71 m_parameters_option_list.add({ name, value });
72 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);
73 return;
74 }
75
76 m_parameters_dictionary.add(name, value);
77 m_parameters_list.add({ name, value });
78 m_parameter_option->addParameter(m_parameters_list[m_parameters_list.size() - 1].name, m_parameters_list[m_parameters_list.size() - 1].value);
79 }
80 void setParameter(const String& name,const String& value)
81 {
82 //std::cout << "__SET_PARAMETER name='" << name << "' v='" << value << "'\n";
83 if (name.empty())
84 return;
85
86 if (name.startsWith("//")) {
87 ARCANE_FATAL("Set parameter not supported for ParameterOptions.");
88 }
89
90 m_parameters_dictionary.add(name,value);
91 // Supprime de la liste toutes les occurences ayant
92 // pour paramètre \a name
93 auto comparer = [=](const NameValuePair& nv){ return nv.name==name; };
94 auto new_end = std::remove_if(m_parameters_list.begin(),m_parameters_list.end(),comparer);
95 m_parameters_list.resize(new_end-m_parameters_list.begin());
96 }
97 void removeParameter(const String& name,const String& value)
98 {
99 //std::cout << "__REMOVE_PARAMETER name='" << name << "' v='" << value << "'\n";
100 if (name.empty())
101 return;
102 if (name.startsWith("//")) {
103 ARCANE_FATAL("Remove parameter not supported for ParameterOptions.");
104 }
105 // Si le paramètre \a name avec la valeur \a value est trouvé, le supprime.
106 // Dans ce cas, il faudra regarder s'il y a toujours
107 // dans \a m_parameters_list un paramètre \a name et si c'est le
108 // cas c'est la valeur de celui-là qu'on prendra
109 String x = m_parameters_dictionary.find(name);
110 bool need_fill = false;
111 if (x==value){
112 m_parameters_dictionary.remove(name);
113 need_fill = true;
114 }
115 // Supprime de la liste toutes les occurences
116 // du paramètre avec la valeur souhaitée
117 NameValuePair ref_value{name,value};
118 auto new_end = std::remove(m_parameters_list.begin(),m_parameters_list.end(),ref_value);
119 m_parameters_list.resize(new_end-m_parameters_list.begin());
120 if (need_fill)
121 _fillDictionaryWithValueInList(name);
122 }
123 void fillParameters(StringList& param_names,StringList& values) const
124 {
125 m_parameters_dictionary.fill(param_names, values);
126 for (const auto& [name, value] : m_parameters_option_list) {
127 param_names.add(name);
128 values.add(value);
129 }
130 }
131 ParameterOptionElementsCollection* getParameterOption() const
132 {
133 return m_parameter_option.get();
134 }
135
136 private:
137 void _fillDictionaryWithValueInList(const String& name)
138 {
139 for( auto& nv : m_parameters_list )
140 if (nv.name==name)
141 m_parameters_dictionary.add(nv.name,nv.value);
142 }
143 private:
144 StringDictionary m_parameters_dictionary;
145 UniqueArray<NameValuePair> m_parameters_list;
146 UniqueArray<NameValuePair> m_parameters_option_list;
147 Ref<ParameterOptionElementsCollection> m_parameter_option;
148};
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
155: m_p(new Impl())
156{
157}
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
164: m_p(new Impl(*rhs.m_p))
165{
166}
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
173{
174 delete m_p;
175}
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
181getParameterOrNull(const String& param_name) const
182{
183 return m_p->getParameter(param_name);
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
190addParameterLine(const String& line)
191{
192 Span<const Byte> bytes = line.bytes();
193 Int64 len = bytes.length();
194 for( Int64 i=0; i<len; ++i ){
195 Byte c = bytes[i];
196 Byte cnext = ((i+1)<len) ? bytes[i+1] : '\0';
197 if (c=='='){
198 m_p->addParameter(line.substring(0,i),line.substring(i+1));
199 return false;
200 }
201 if (c=='+' && cnext=='='){
202 m_p->addParameter(line.substring(0,i),line.substring(i+2));
203 return false;
204 }
205 if (c==':' && cnext=='='){
206 m_p->setParameter(line.substring(0,i),line.substring(i+2));
207 return false;
208 }
209 if (c=='-' && cnext=='='){
210 m_p->removeParameter(line.substring(0,i),line.substring(i+2));
211 return false;
212 }
213 }
214 return true;
215}
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
221fillParameters(StringList& param_names,StringList& values) const
222{
223 m_p->fillParameters(param_names,values);
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
230getParameterCaseOption(const String& language) const
231{
232 return { m_p->getParameterOption(), language };
233}
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238} // End namespace Arcane
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe représentant l'ensemble des paramètres pouvant modifier les options du jeu de données.
void fillParameters(StringList &param_names, StringList &values) const
Récupère la liste des paramètres et leur valeur.
bool addParameterLine(const String &line)
Analyse la ligne line.
String getParameterOrNull(const String &param_name) const
Récupère le paramètre de nom param_name.
~ParameterList()
Libère les ressources.
ParameterCaseOption getParameterCaseOption(const String &language) const
Méthode permettant de récupérer un objet de type ParameterCaseOption.
ParameterList()
Implémentation.
constexpr __host__ __device__ SizeType length() const noexcept
Nombre d'éléments du tableau.
Definition Span.h:216
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
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:1099
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:291
StringView view() const
Retourne une vue sur la chaîne actuelle.
Definition String.cc:367
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
Definition String.cc:1114
-*- 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:596
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.