Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ApplicationBuildInfo.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/* ApplicationBuildInfo.cc (C) 2000-2025 */
9/* */
10/* Informations pour construire une instance de IApplication. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/ApplicationBuildInfo.h"
15
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/String.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/ValueConvert.h"
20#include "arcane/utils/CommandLineArguments.h"
21#include "arcane/utils/TraceClassConfig.h"
22#include "arcane/utils/ApplicationInfo.h"
23
24#include "arcane/CaseDatasetSource.h"
25
26#include <functional>
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31namespace Arcane
32{
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace
38{
39void _clamp(Int32& x,Int32 min_value,Int32 max_value)
40{
41 x = std::min(std::max(x,min_value),max_value);
42}
43}
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
49{
50 public:
51
52 template <typename DataType>
53 class Property
54 {
55 public:
56
57 explicit Property(DataType default_value)
58 : m_value(default_value)
59 , m_default_value(default_value)
60 {}
61 Property()
62 : Property(DataType())
63 {}
64 Property<DataType>& operator=(const DataType& v)
65 {
66 setValue(v);
67 return (*this);
68 }
69 operator DataType() const { return m_value; }
70
71 public:
72
73 void setValue(const DataType& v)
74 {
75 if (m_validator) {
76 DataType copy(v);
77 m_validator(copy);
78 m_value = copy;
79 }
80 else
81 m_value = v;
82 m_has_value = true;
83 }
84 DataType value() const { return m_value; }
85 bool isValueSet() const { return m_has_value; }
86 void setValidator(std::function<void(DataType&)>&& func) { m_validator = func; }
87
88 private:
89
90 DataType m_value;
91 DataType m_default_value;
92 bool m_has_value = false;
93 std::function<void(DataType&)> m_validator;
94 };
95
96 class Int32Value
97 {
98 public:
99
100 explicit Int32Value(Int32 v)
101 : value(v)
102 {}
103 operator Int32() const { return value; }
104
105 public:
106
107 Int32Value minValue(Int32 x)
108 {
109 return Int32Value(std::max(value, x));
110 }
111 Int32Value maxValue(Int32 x)
112 {
113 return Int32Value(std::min(value, x));
114 }
115
116 public:
117
118 Int32 value;
119 };
120
121 static Int32Value getInt32(const String& str_value, Int32 default_value)
122 {
123 Int32 v = default_value;
124 if (!str_value.null()) {
125 bool is_bad = builtInGetValue(v, str_value);
126 if (is_bad)
127 v = default_value;
128 }
129 return Int32Value(v);
130 }
131 static void checkSet(Property<bool>& p, const String& str_value)
132 {
133 if (p.isValueSet())
134 return;
135 if (str_value.null())
136 return;
137 bool v = 0;
138 bool is_bad = builtInGetValue(v, str_value);
139 if (!is_bad)
140 p.setValue(v);
141 }
142 static void checkSet(Property<Int32>& p, const String& str_value)
143 {
144 if (p.isValueSet())
145 return;
146 if (str_value.null())
147 return;
148 Int32 v = 0;
149 bool is_bad = builtInGetValue(v, str_value);
150 if (!is_bad)
151 p.setValue(v);
152 }
153 static void checkSet(Property<StringList>& p, const String& str_value)
154 {
155 if (p.isValueSet())
156 return;
157 if (str_value.null())
158 return;
159 StringList s;
160 s.add(str_value);
161 p.setValue(s);
162 }
163 static void checkSet(Property<StringList>& p, const StringList& str_values)
164 {
165 if (p.isValueSet())
166 return;
167 p.setValue(str_values);
168 }
169 static void checkSet(Property<String>& p, const String& str_value)
170 {
171 if (p.isValueSet())
172 return;
173 if (str_value.null())
174 return;
175 p.setValue(str_value);
176 }
177};
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
183{
184 public:
185
186 template <typename T> using Property = PropertyImpl::Property<T>;
187
188 CoreImpl()
189 : m_nb_task_thread(-1)
190 {
191 // Fixe une limite pour le nombre de tâches
192 m_nb_task_thread.setValidator([](Int32& x) { _clamp(x, -1, 512); });
193 }
194
195 public:
196
197 Property<StringList> m_task_implementation_services;
198 Property<StringList> m_thread_implementation_services;
199 Property<Int32> m_nb_task_thread;
200};
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
206{
207 template <typename T> using Property = PropertyImpl::Property<T>;
208
209 public:
210
211 class NameValuePair
212 {
213 public:
214 NameValuePair(const String& n,const String& v) : name(n), value(v){}
215 String name;
216 String value;
217 };
218 public:
219
220 Impl()
221 : m_nb_shared_memory_sub_domain(0)
222 , m_nb_replication_sub_domain(0)
223 , m_nb_processus_sub_domain(0)
224 , m_config_file_name("")
225 {
226 // Fixe une limite en dur pour éviter d'avoir trop de sous-domaines
227 // en mémoire partagé (le maximum est en général le nombre de coeurs par
228 // noeud)
229 m_nb_shared_memory_sub_domain.setValidator([](Int32& x){ _clamp(x,0,1024); });
230 m_nb_replication_sub_domain.setValidator([](Int32& x){ x = std::max(x,0); });
231 m_nb_processus_sub_domain.setValidator([](Int32& x){ x = std::max(x,0); });
232 }
233
234 public:
235
248 String getValue(const UniqueArray<String>& env_values, const String& param_name,
249 const String& default_value)
250 {
251 if (!param_name.null()) {
252 String v = _searchParam(param_name);
253 if (!v.null())
254 return v;
255 }
256 for (const auto& x : env_values) {
258 if (!ev.null())
259 return ev;
260 }
261 return default_value;
262 }
263
264 public:
265
266 Property<String> m_message_passing_service;
267 Property<Int32> m_nb_shared_memory_sub_domain;
268 Property<Int32> m_nb_replication_sub_domain;
269 Property<Int32> m_nb_processus_sub_domain;
270 Property<String> m_config_file_name;
271 Property<Int32> m_output_level;
272 Property<Int32> m_verbosity_level;
273 Property<Int32> m_minimal_verbosity_level;
274 Property<bool> m_is_master_has_output_file;
275 Property<String> m_output_directory;
276 Property<String> m_thread_binding_strategy;
278 ApplicationInfo m_app_info;
279 CaseDatasetSource m_case_dataset_source;
280 String m_default_message_passing_service;
281
282 private:
283
284 String _searchParam(const String& param_name)
285 {
286 String v;
287 // Une option peut être présente plusieurs fois. Prend la dernière.
288 for (const auto& x : m_values) {
289 if (x.name == param_name)
290 v = x.value;
291 }
292 return v;
293 }
294};
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299ApplicationCoreBuildInfo::
300ApplicationCoreBuildInfo()
301: m_core(new CoreImpl())
302{
303}
304
305ApplicationCoreBuildInfo::
306ApplicationCoreBuildInfo(const ApplicationCoreBuildInfo& rhs)
307: m_core(new CoreImpl(*rhs.m_core))
308{
309}
310
311ApplicationCoreBuildInfo& ApplicationCoreBuildInfo::
312operator=(const ApplicationCoreBuildInfo& rhs)
313{
314 if (&rhs != this) {
315 delete m_core;
316 m_core = new CoreImpl(*(rhs.m_core));
317 }
318 return (*this);
319}
320
321ApplicationCoreBuildInfo::
322~ApplicationCoreBuildInfo()
323{
324 delete m_core;
325}
326
327/*---------------------------------------------------------------------------*/
328/*---------------------------------------------------------------------------*/
329
330ApplicationBuildInfo::
331ApplicationBuildInfo()
332: m_p(new Impl())
333{
334}
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
339ApplicationBuildInfo::
340ApplicationBuildInfo(const ApplicationBuildInfo& rhs)
341: ApplicationCoreBuildInfo(rhs)
342, m_p(new Impl(*rhs.m_p))
343{
344}
345
346ApplicationBuildInfo& ApplicationBuildInfo::
347operator=(const ApplicationBuildInfo& rhs)
348{
349 ApplicationCoreBuildInfo::operator=(rhs);
350 if (&rhs != this) {
351 delete m_p;
352 m_p = new Impl(*(rhs.m_p));
353 }
354 return (*this);
355}
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
360ApplicationBuildInfo::
361~ApplicationBuildInfo()
362{
363 delete m_p;
364}
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
369void ApplicationBuildInfo::
370setDefaultValues()
371{
372 {
373 String str = m_p->getValue({ "ARCANE_NB_TASK" }, "T", String());
374 PropertyImpl::checkSet(m_core->m_nb_task_thread, str);
375 }
376 {
377 String str = m_p->getValue({ "ARCANE_NB_THREAD" }, "S", String());
378 PropertyImpl::checkSet(m_p->m_nb_shared_memory_sub_domain, str);
379 }
380 {
381 String str = m_p->getValue({ "ARCANE_NB_REPLICATION" }, "R", String());
382 PropertyImpl::checkSet(m_p->m_nb_replication_sub_domain, str);
383 }
384 {
385 String str = m_p->getValue({ "ARCANE_NB_SUB_DOMAIN" }, "P", String());
386 PropertyImpl::checkSet(m_p->m_nb_processus_sub_domain, str);
387 }
388 {
389 String str = m_p->getValue( { "ARCANE_OUTPUT_LEVEL" }, "OutputLevel",
390 String::fromNumber(Trace::UNSPECIFIED_VERBOSITY_LEVEL));
391 PropertyImpl::checkSet(m_p->m_output_level, str);
392 }
393 {
394 String str = m_p->getValue( { "ARCANE_VERBOSITY_LEVEL", "ARCANE_VERBOSE_LEVEL" }, "VerbosityLevel",
395 String::fromNumber(Trace::UNSPECIFIED_VERBOSITY_LEVEL));
396 PropertyImpl::checkSet(m_p->m_verbosity_level, str);
397 }
398 {
399 String str = m_p->getValue( { }, "MinimalVerbosityLevel",
400 String::fromNumber(Trace::UNSPECIFIED_VERBOSITY_LEVEL));
401 PropertyImpl::checkSet(m_p->m_minimal_verbosity_level, str);
402 }
403 {
404 String str = m_p->getValue({ "ARCANE_MASTER_HAS_OUTPUT_FILE" }, "MasterHasOutputFile", "0");
405 PropertyImpl::checkSet(m_p->m_is_master_has_output_file, str);
406 }
407 {
408 String str = m_p->getValue( { "ARCANE_OUTPUT_DIRECTORY" }, "OutputDirectory",
409 String());
410 PropertyImpl::checkSet(m_p->m_output_directory, str);
411 }
412 {
413 String str = m_p->getValue( { }, "CaseDatasetFileName",
414 String() );
415 if (!str.null())
416 m_p->m_case_dataset_source.setFileName(str);
417 }
418 {
419 String str = m_p->getValue( { "ARCANE_THREAD_BINDING_STRATEGY" }, "ThreadBindingStrategy",
420 String());
421 PropertyImpl::checkSet(m_p->m_thread_binding_strategy, str);
422 }
423}
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427
428void ApplicationBuildInfo::
429setDefaultServices()
430{
431 bool has_shm = nbSharedMemorySubDomain()>0;
432 {
433 String str = m_p->getValue( { "ARCANE_TASK_IMPLEMENTATION" }, "TaskService", "TBB");
434 String service_name = str + "TaskImplementation";
435 PropertyImpl::checkSet(m_core->m_task_implementation_services, service_name);
436 }
437 {
438 StringList list1;
439 String thread_str = m_p->getValue( { "ARCANE_THREAD_IMPLEMENTATION" }, "ThreadService" ,"Std");
440 list1.add(thread_str+"ThreadImplementationService");
441 list1.add("TBBThreadImplementationService");
442 PropertyImpl::checkSet(m_core->m_thread_implementation_services, list1);
443 }
444 {
445 String def_name = (has_shm) ? "Thread" : "Sequential";
446 String default_service_name = def_name+"ParallelSuperMng";
447 // Positionne la valeur par défaut si ce n'est pas déjà fait.
448 if (m_p->m_default_message_passing_service.null())
449 m_p->m_default_message_passing_service = default_service_name;
450
451 String str = m_p->getValue({ "ARCANE_PARALLEL_SERVICE" }, "MessagePassingService", String());
452 if (!str.null()) {
453 String service_name = str + "ParallelSuperMng";
454 PropertyImpl::checkSet(m_p->m_message_passing_service, service_name);
455 }
456 }
457}
458
459/*---------------------------------------------------------------------------*/
460/*---------------------------------------------------------------------------*/
461
462void ApplicationBuildInfo::
463setMessagePassingService(const String& name)
464{
465 m_p->m_message_passing_service = name;
466}
467
468String ApplicationBuildInfo::
469messagePassingService() const
470{
471 return m_p->m_message_passing_service;
472}
473
474/*---------------------------------------------------------------------------*/
475/*---------------------------------------------------------------------------*/
476
477void ApplicationCoreBuildInfo::
478setTaskImplementationService(const String& name)
479{
480 StringList s;
481 s.add(name);
482 m_core->m_task_implementation_services = s;
483}
484void ApplicationCoreBuildInfo::
485setTaskImplementationServices(const StringList& names)
486{
487 m_core->m_task_implementation_services = names;
488}
489StringList ApplicationCoreBuildInfo::
490taskImplementationServices() const
491{
492 return m_core->m_task_implementation_services;
493}
494
495/*---------------------------------------------------------------------------*/
496/*---------------------------------------------------------------------------*/
497
498void ApplicationCoreBuildInfo::
499setThreadImplementationService(const String& name)
500{
501 StringList s;
502 s.add(name);
503 m_core->m_thread_implementation_services = s;
504}
505void ApplicationCoreBuildInfo::
506setThreadImplementationServices(const StringList& names)
507{
508 m_core->m_thread_implementation_services = names;
509}
510StringList ApplicationCoreBuildInfo::
511threadImplementationServices() const
512{
513 return m_core->m_thread_implementation_services;
514}
515
516/*---------------------------------------------------------------------------*/
517/*---------------------------------------------------------------------------*/
518
519Int32 ApplicationCoreBuildInfo::
520nbTaskThread() const
521{
522 return m_core->m_nb_task_thread;
523}
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527
528void ApplicationCoreBuildInfo::
529setNbTaskThread(Int32 v)
530{
531 m_core->m_nb_task_thread = v;
532}
533
534/*---------------------------------------------------------------------------*/
535/*---------------------------------------------------------------------------*/
536
537Int32 ApplicationBuildInfo::
538nbSharedMemorySubDomain() const
539{
540 return m_p->m_nb_shared_memory_sub_domain;
541}
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
546void ApplicationBuildInfo::
547setNbSharedMemorySubDomain(Int32 v)
548{
549 m_p->m_nb_shared_memory_sub_domain = v;
550}
551
552/*---------------------------------------------------------------------------*/
553/*---------------------------------------------------------------------------*/
554
555Int32 ApplicationBuildInfo::
556nbReplicationSubDomain() const
557{
558 return m_p->m_nb_replication_sub_domain;
559}
560
561/*---------------------------------------------------------------------------*/
562/*---------------------------------------------------------------------------*/
563
564void ApplicationBuildInfo::
565setNbReplicationSubDomain(Int32 v)
566{
567 m_p->m_nb_replication_sub_domain = v;
568}
569
570/*---------------------------------------------------------------------------*/
571/*---------------------------------------------------------------------------*/
572
573Int32 ApplicationBuildInfo::
574nbProcessusSubDomain() const
575{
576 return m_p->m_nb_processus_sub_domain;
577}
578
579/*---------------------------------------------------------------------------*/
580/*---------------------------------------------------------------------------*/
581
582void ApplicationBuildInfo::
583setNbProcessusSubDomain(Int32 v)
584{
585 m_p->m_nb_processus_sub_domain = v;
586}
587
588/*---------------------------------------------------------------------------*/
589/*---------------------------------------------------------------------------*/
590
592configFileName() const
593{
594 return m_p->m_config_file_name;
595}
596
597/*---------------------------------------------------------------------------*/
598/*---------------------------------------------------------------------------*/
599
602{
603 m_p->m_config_file_name = v;
604}
605
606/*---------------------------------------------------------------------------*/
607/*---------------------------------------------------------------------------*/
608
609Int32 ApplicationBuildInfo::
610outputLevel() const
611{
612 return m_p->m_output_level;
613}
614
617{
618 m_p->m_output_level = v;
619}
620
621/*---------------------------------------------------------------------------*/
622/*---------------------------------------------------------------------------*/
623
624Int32 ApplicationBuildInfo::
625verbosityLevel() const
626{
627 return m_p->m_verbosity_level;
628}
629
632{
633 m_p->m_verbosity_level = v;
634}
635
636/*---------------------------------------------------------------------------*/
637/*---------------------------------------------------------------------------*/
638
639Int32 ApplicationBuildInfo::
640minimalVerbosityLevel() const
641{
642 return m_p->m_minimal_verbosity_level;
643}
644
645void ApplicationBuildInfo::
646setMinimalVerbosityLevel(Int32 v)
647{
648 m_p->m_minimal_verbosity_level = v;
649}
650
651/*---------------------------------------------------------------------------*/
652/*---------------------------------------------------------------------------*/
653
654bool ApplicationBuildInfo::
655isMasterHasOutputFile() const
656{
657 return m_p->m_is_master_has_output_file;
658}
659
660void ApplicationBuildInfo::
661setIsMasterHasOutputFile(bool v)
662{
663 m_p->m_is_master_has_output_file = v;
664}
665
666/*---------------------------------------------------------------------------*/
667/*---------------------------------------------------------------------------*/
668
669String ApplicationBuildInfo::
670outputDirectory() const
671{
672 return m_p->m_output_directory;
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
680{
681 m_p->m_output_directory = v;
682}
683
684/*---------------------------------------------------------------------------*/
685/*---------------------------------------------------------------------------*/
686
689{
690 return m_p->m_thread_binding_strategy;
691}
692
695{
696 m_p->m_thread_binding_strategy = v;
697}
698
699/*---------------------------------------------------------------------------*/
700/*---------------------------------------------------------------------------*/
701
702void ApplicationBuildInfo::
703addParameter(const String& name,const String& value)
704{
705 m_p->m_values.add(Impl::NameValuePair(name,value));
706}
707
708/*---------------------------------------------------------------------------*/
709/*---------------------------------------------------------------------------*/
710
712parseArguments(const CommandLineArguments& command_line_args)
713{
714 // On ne récupère que les arguments du style:
715 // -A,x=b,y=c
716 StringList names;
717 StringList values;
718 command_line_args.fillParameters(names,values);
719 for( Integer i=0, n=names.count(); i<n; ++i ){
720 addParameter(names[i],values[i]);
721 }
722 setDefaultValues();
723}
724
725/*---------------------------------------------------------------------------*/
726/*---------------------------------------------------------------------------*/
727
728ApplicationInfo& ApplicationBuildInfo::
729_internalApplicationInfo()
730{
731 return m_p->m_app_info;
732}
733
734/*---------------------------------------------------------------------------*/
735/*---------------------------------------------------------------------------*/
736
737const ApplicationInfo& ApplicationBuildInfo::
738_internalApplicationInfo() const
739{
740 return m_p->m_app_info;
741}
742
743/*---------------------------------------------------------------------------*/
744/*---------------------------------------------------------------------------*/
745
748{
749 m_p->m_app_info.setApplicationName(v);
750}
752applicationName() const
753{
754 return m_p->m_app_info.applicationName();
755}
756
757/*---------------------------------------------------------------------------*/
758/*---------------------------------------------------------------------------*/
759
761setCodeVersion(const VersionInfo& version_info)
762{
763 m_p->m_app_info.setCodeVersion(version_info);
764}
765
767codeVersion() const
768{
769 return m_p->m_app_info.codeVersion();
770}
771
772/*---------------------------------------------------------------------------*/
773/*---------------------------------------------------------------------------*/
774
776setCodeName(const String& code_name)
777{
778 m_p->m_app_info.setCodeName(code_name);
779}
780
782codeName() const
783{
784 return m_p->m_app_info.codeName();
785}
786
787/*---------------------------------------------------------------------------*/
788/*---------------------------------------------------------------------------*/
789
792{
793 return m_p->m_case_dataset_source;
794}
795
797caseDatasetSource() const
798{
799 return m_p->m_case_dataset_source;
800}
801
802/*---------------------------------------------------------------------------*/
803/*---------------------------------------------------------------------------*/
804
806addDynamicLibrary(const String& lib_name)
807{
808 m_p->m_app_info.addDynamicLibrary(lib_name);
809}
810
811/*---------------------------------------------------------------------------*/
812/*---------------------------------------------------------------------------*/
813
816{
817 m_p->m_default_message_passing_service = name;
818}
819
820/*---------------------------------------------------------------------------*/
821/*---------------------------------------------------------------------------*/
822
823String ApplicationBuildInfo::
824internalDefaultMessagePassingService() const
825{
826 return m_p->m_default_message_passing_service;
827}
828
829/*---------------------------------------------------------------------------*/
830/*---------------------------------------------------------------------------*/
831
832} // End namespace Arcane
833
834/*---------------------------------------------------------------------------*/
835/*---------------------------------------------------------------------------*/
836
String getValue(const UniqueArray< String > &env_values, const String &param_name, const String &default_value)
Récupère la valeur d'une option.
void setVerbosityLevel(Int32 v)
Positionne le niveau de verbosité des messages des fichiers listings réduits.
void setOutputDirectory(const String &name)
Positionne le répertoire contenant les différentes sorties de la simulation.
VersionInfo codeVersion() const
Numéro de version.
void setOutputLevel(Int32 v)
Positionne le niveau de verbosité des messages sur la sortie standard.
String configFileName() const
Nom du fichier de configuration du code.
void addDynamicLibrary(const String &lib_name)
Ajoute la bibliothèque lib_name à la liste des bibliothèques chargées dynamiquements.
void internalSetDefaultMessagePassingService(const String &name)
Nom du gestionnaire de message par défaut. Ne doit être modifié que par Arcane.
void setCodeName(const String &code_name)
Positionne le nom du code.
String applicationName() const
Nom de l'application.
void parseArguments(const CommandLineArguments &args)
Analyse les arguments de args.
void setApplicationName(const String &v)
Positionne le nom de l'application.
String codeName() const
Retourne le nom du code.
CaseDatasetSource & caseDatasetSource()
Source du jeu de données.
void setConfigFileName(const String &name)
Positionne le fichier de configuration du code.
void setCodeVersion(const VersionInfo &version_info)
Positionne le numéro de version du code.
String threadBindingStrategy() const
Stratégie pour punaiser les threads des tâches.
Informations sur une application.
void setApplicationName(const String &v)
Positionne le nom de l'application.
Source d'un jeu de données d'un cas.
Integer count() const
Nombre d'éléments de la collection.
void fillParameters(StringList &param_names, StringList &values) const
Récupère la liste des paramètres et leur valeur.
Définition des types pour les propriétés.
Definition IProperty.h:39
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:305
Vecteur 1D de données avec sémantique par valeur (style STL).
Informations sur une version.
Definition VersionInfo.h:46
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:513
std::int32_t Int32
Type entier signé sur 32 bits.