Arcane  v3.14.10.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-2022 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-2020 */
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
19#include <algorithm>
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
31{
32 public:
34 {
35 String name;
36 String value;
37 friend bool operator==(const NameValuePair& v1,const NameValuePair& v2)
38 {
39 return (v1.name==v2.name && v1.value==v2.value);
40 }
41 };
42 public:
43 Impl() {}
44 public:
45 String getParameter(const String& key)
46 {
47 String x = m_parameters_dictionary.find(key);
48 return x;
49 }
50
51 void addParameter(const String& name,const String& value)
52 {
53 //std::cout << "__ADD_PARAMETER name='" << name << "' v='" << value << "'\n";
54 if (name.empty())
55 return;
56 m_parameters_dictionary.add(name,value);
57 m_parameters_list.add({name,value});
58 }
59 void setParameter(const String& name,const String& value)
60 {
61 //std::cout << "__SET_PARAMETER name='" << name << "' v='" << value << "'\n";
62 if (name.empty())
63 return;
64 m_parameters_dictionary.add(name,value);
65 // Supprime de la liste toutes les occurences ayant
66 // pour paramètre \a name
67 auto comparer = [=](const NameValuePair& nv){ return nv.name==name; };
68 auto new_end = std::remove_if(m_parameters_list.begin(),m_parameters_list.end(),comparer);
69 m_parameters_list.resize(new_end-m_parameters_list.begin());
70 }
71 void removeParameter(const String& name,const String& value)
72 {
73 //std::cout << "__REMOVE_PARAMETER name='" << name << "' v='" << value << "'\n";
74 if (name.empty())
75 return;
76 // Si le paramètre \a name avec la valeur \a value est trouvé, le supprime.
77 // Dans ce cas, il faudra regarder s'il y a toujours
78 // dans \a m_parameters_list un paramètre \a name et si c'est le
79 // cas c'est la valeur de celui-là qu'on prendra
80 String x = m_parameters_dictionary.find(name);
81 bool need_fill = false;
82 if (x==value){
83 m_parameters_dictionary.remove(name);
84 need_fill = true;
85 }
86 // Supprime de la liste toutes les occurences
87 // du paramètre avec la valeur souhaitée
88 NameValuePair ref_value{name,value};
89 auto new_end = std::remove(m_parameters_list.begin(),m_parameters_list.end(),ref_value);
90 m_parameters_list.resize(new_end-m_parameters_list.begin());
91 if (need_fill)
92 _fillDictionaryWithValueInList(name);
93 }
94 void fillParameters(StringList& param_names,StringList& values) const
95 {
96 m_parameters_dictionary.fill(param_names,values);
97 }
98 private:
99 void _fillDictionaryWithValueInList(const String& name)
100 {
101 for( auto& nv : m_parameters_list )
102 if (nv.name==name)
103 m_parameters_dictionary.add(nv.name,nv.value);
104 }
105 private:
106 StringDictionary m_parameters_dictionary;
107 UniqueArray<NameValuePair> m_parameters_list;
108};
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
115: m_p(new Impl())
116{
117}
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121
124: m_p(new Impl(*rhs.m_p))
125{
126}
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
133{
134 delete m_p;
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
142{
143 return m_p->getParameter(param_name);
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
150addParameterLine(const String& line)
151{
152 Span<const Byte> bytes = line.bytes();
153 Int64 len = bytes.length();
154 for( Int64 i=0; i<len; ++i ){
155 Byte c = bytes[i];
156 Byte cnext = ((i+1)<len) ? bytes[i+1] : '\0';
157 if (c=='='){
158 m_p->addParameter(line.substring(0,i),line.substring(i+1));
159 return false;
160 }
161 if (c=='+' && cnext=='='){
162 m_p->addParameter(line.substring(0,i),line.substring(i+2));
163 return false;
164 }
165 if (c==':' && cnext=='='){
166 m_p->setParameter(line.substring(0,i),line.substring(i+2));
167 return false;
168 }
169 if (c=='-' && cnext=='='){
170 m_p->removeParameter(line.substring(0,i),line.substring(i+2));
171 return false;
172 }
173 }
174 return true;
175}
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
182{
183 m_p->fillParameters(param_names,values);
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189} // End namespace Arcane
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Liste de paramètres.
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.
Impl * m_p
Implémentation.
ParameterList()
Implémentation.
void fill(StringList &param_names, StringList &values) const
Remplit keys et values avec les valeurs correspondantes du dictionnaire.
String remove(const String &key)
Supprime la valeur associée à key.
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:291
String substring(Int64 pos) const
Sous-chaîne commençant à la position pos.
Definition String.cc:1114
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Definition MathUtils.h:885
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:667