Arcane  v4.1.2.0
Documentation développeur
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 "arccore/common/ParameterList.h"
15#include "arccore/common/StringDictionary.h"
16#include "arccore/base/String.h"
17#include "arccore/common/Array.h"
18#include "arccore/base/FatalErrorException.h"
19//#include "arccore/common/Ref.h"
20
21#include <algorithm>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
33{
34 public:
36 {
37 String name;
38 String value;
39 friend bool operator==(const NameValuePair& v1,const NameValuePair& v2)
40 {
41 return (v1.name==v2.name && v1.value==v2.value);
42 }
43 };
44 public:
45
46 Impl()
47 {}
48
49 public:
50
51 String getParameter(const String& key)
52 {
53 String x = m_parameters_dictionary.find(key);
54 return x;
55 }
56
57 void addParameter(const String& name,const String& value)
58 {
59 //std::cout << "__ADD_PARAMETER name='" << name << "' v='" << value << "'\n";
60 if (name.empty())
61 return;
62
63 m_parameters_dictionary.add(name, value);
64 m_parameters_list.add({ name, value });
65 }
66 void setParameter(const String& name,const String& value)
67 {
68 //std::cout << "__SET_PARAMETER name='" << name << "' v='" << value << "'\n";
69 if (name.empty())
70 return;
71
72 if (name.startsWith("//")) {
73 ARCCORE_FATAL("Set parameter not supported for ParameterOptions.");
74 }
75
76 m_parameters_dictionary.add(name,value);
77 // Supprime de la liste toutes les occurences ayant
78 // pour paramètre \a name
79 auto comparer = [=](const NameValuePair& nv){ return nv.name==name; };
80 auto new_end = std::remove_if(m_parameters_list.begin(),m_parameters_list.end(),comparer);
81 m_parameters_list.resize(new_end-m_parameters_list.begin());
82 }
83 void removeParameter(const String& name,const String& value)
84 {
85 //std::cout << "__REMOVE_PARAMETER name='" << name << "' v='" << value << "'\n";
86 if (name.empty())
87 return;
88 if (name.startsWith("//")) {
89 ARCCORE_FATAL("Remove parameter not supported for ParameterOptions.");
90 }
91 // Si le paramètre \a name avec la valeur \a value est trouvé, le supprime.
92 // Dans ce cas, il faudra regarder s'il y a toujours
93 // dans \a m_parameters_list un paramètre \a name et si c'est le
94 // cas c'est la valeur de celui-là qu'on prendra
95 String x = m_parameters_dictionary.find(name);
96 bool need_fill = false;
97 if (x==value){
98 m_parameters_dictionary.remove(name);
99 need_fill = true;
100 }
101 // Supprime de la liste toutes les occurences
102 // du paramètre avec la valeur souhaitée
103 NameValuePair ref_value{name,value};
104 auto new_end = std::remove(m_parameters_list.begin(),m_parameters_list.end(),ref_value);
105 m_parameters_list.resize(new_end-m_parameters_list.begin());
106 if (need_fill)
107 _fillDictionaryWithValueInList(name);
108 }
109 void fillParameters(StringList& param_names,StringList& values) const
110 {
111 m_parameters_dictionary.fill(param_names, values);
112 }
113
114 private:
115 void _fillDictionaryWithValueInList(const String& name)
116 {
117 for( auto& nv : m_parameters_list )
118 if (nv.name==name)
119 m_parameters_dictionary.add(nv.name,nv.value);
120 }
121 private:
122 StringDictionary m_parameters_dictionary;
123 UniqueArray<NameValuePair> m_parameters_list;
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
131: m_p(new Impl())
132{
133}
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
140: m_p(new Impl(*rhs.m_p))
141{
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
149{
150 delete m_p;
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
157getParameterOrNull(const String& param_name) const
158{
159 return m_p->getParameter(param_name);
160}
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
166addParameterLine(const String& line)
167{
168 Span<const Byte> bytes = line.bytes();
169 Int64 len = bytes.length();
170 for( Int64 i=0; i<len; ++i ){
171 Byte c = bytes[i];
172 Byte cnext = ((i+1)<len) ? bytes[i+1] : '\0';
173 if (c=='='){
174 m_p->addParameter(line.substring(0,i),line.substring(i+1));
175 return false;
176 }
177 if (c=='+' && cnext=='='){
178 m_p->addParameter(line.substring(0,i),line.substring(i+2));
179 return false;
180 }
181 if (c==':' && cnext=='='){
182 m_p->setParameter(line.substring(0,i),line.substring(i+2));
183 return false;
184 }
185 if (c=='-' && cnext=='='){
186 m_p->removeParameter(line.substring(0,i),line.substring(i+2));
187 return false;
188 }
189 }
190 return true;
191}
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
197fillParameters(StringList& param_names,StringList& values) const
198{
199 m_p->fillParameters(param_names,values);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205} // End namespace Arcane
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
ParameterList()
Implémentation.
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
void add(const String &key, const String &value)
Ajoute le couple (key,value) au dictionnaire.
String find(const String &key, bool throw_exception=false) const
Retourne la valeur associée à key.
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:292
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:316
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:509
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43