14#include "arcane/utils/PlatformUtils.h"
15#include "arcane/utils/List.h"
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/Deleter.h"
18#include "arcane/utils/StringBuilder.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/TraceAccessor.h"
21#include "arcane/utils/FatalErrorException.h"
22#include "arcane/utils/OStringStream.h"
23#include "arcane/utils/ScopedPtr.h"
24#include "arcane/utils/ApplicationInfo.h"
25#include "arcane/utils/NotImplementedException.h"
26#include "arcane/utils/CriticalSection.h"
27#include "arcane/utils/CommandLineArguments.h"
28#include "arcane/utils/internal/ParameterListWithCaseOption.h"
30#include "arcane/core/ISubDomain.h"
31#include "arcane/core/IApplication.h"
32#include "arcane/core/IParallelMng.h"
33#include "arcane/core/IParallelSuperMng.h"
34#include "arcane/core/ICaseMng.h"
35#include "arcane/core/IModule.h"
36#include "arcane/core/CaseOptions.h"
37#include "arcane/core/XmlNode.h"
38#include "arcane/core/XmlNodeList.h"
39#include "arcane/core/XmlNodeIterator.h"
40#include "arcane/core/ICaseDocument.h"
41#include "arcane/core/ICaseFunctionProvider.h"
42#include "arcane/core/CaseNodeNames.h"
43#include "arcane/core/ISession.h"
44#include "arcane/core/CaseTable.h"
45#include "arcane/core/IMainFactory.h"
46#include "arcane/core/IIOMng.h"
47#include "arcane/core/ServiceFinder2.h"
48#include "arcane/core/ObservablePool.h"
49#include "arcane/core/ICaseDocumentVisitor.h"
50#include "arcane/core/ServiceBuilder.h"
51#include "arcane/core/internal/ICaseMngInternal.h"
53#include "arcane/impl/CaseDocumentLangTranslator.h"
64extern "C++" std::unique_ptr<ICaseDocumentVisitor>
81 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
89 void read(
bool is_phase1);
93 void _read(
bool is_phase1);
94 void _searchInvalidOptions();
101 explicit ErrorInfo(
const String& error_message)
102 : m_has_error(
true), m_error_message(error_message){}
103 ErrorInfo() : m_has_error(
false){}
105 bool hasError()
const {
return m_has_error; }
106 const String& errorMessage()
const {
return m_error_message; }
116 class CaseOptionsFilterUsed
120 : m_begin(opt_list.begin()), m_end(opt_list.end()){}
122 auto begin()
const {
return m_begin; }
123 auto end()
const {
return m_end; }
126 bool do_continue =
true;
129 if (m_begin >= m_end)
133 do_continue = (md && !md->
used());
134 }
while (do_continue);
137 CaseOptionsList::const_iterator m_begin;
138 CaseOptionsList::const_iterator m_end;
190 return m_observables[type];
204 return arcaneCreateCaseDocumentFragment(
traceMng(),document);
211 String msgClassName()
const {
return "CaseMng"; }
220 bool m_treat_warning_as_error =
false;
221 bool m_allow_unknown_root_element =
true;
232 void _readOptions(
bool is_phase1);
233 void _readFunctions();
236 void _checkTranslateDocument();
245 void _readOneDotNetFunction(
const String& assembly_name,
const String& class_name);
251void CaseMng::OptionsReader::
256 _searchInvalidOptions();
262void CaseMng::OptionsReader::
266 for( ICaseOptions* co : m_options){
267 co->read(read_phase);
274void CaseMng::OptionsReader::
275_searchInvalidOptions()
279 XmlNodeList invalid_elems;
280 for( ICaseOptions* co : m_options)
281 co->addInvalidChildren(invalid_elems);
288CaseMng(ISubDomain* sub_domain)
291, m_treat_warning_as_error(false)
294 m_treat_warning_as_error =
true;
301 m_parameters.addParameters(sub_domain->application()->applicationInfo().commandLineArguments().parameters());
334 info() <<
"Reading the input data (phase1): language '"
338 info() <<
"Reading the input data (phase2)";
353 _readOptions(is_phase1);
354 _printErrors(doc,is_phase1);
356 _checkTranslateDocument();
363_checkTranslateDocument()
368 if (!tr_lang.
null()){
369 info() <<
"Generating translation for case file to lang=" << tr_lang;
371 String convert_string = translator.translate(
this,tr_lang);
373 std::ofstream ofile(
"convert_info.txt");
389 if (!m_treat_warning_as_error){
391 if (doc->hasWarnings()){
393 doc->printWarnings(ostr());
394 pwarning() <<
"The input data are not coherent:\n\n" << ostr.str();
398 bool has_error = doc->hasError();
399 if (doc->hasWarnings() && m_treat_warning_as_error && !is_phase1)
404 if (m_treat_warning_as_error && doc->hasWarnings())
405 doc->printWarnings(ostr());
406 doc->printErrors(ostr());
407 ARCANE_FATAL(
"Input data are invalid:\n\n{0}",ostr.str());
428 info() <<
"NB_CASE_FUNCTION_PROVIDER_FACTORY = " << factories.
size();
429 for(
const auto& factory : factories ){
432 info() <<
"FOUND CASE FUNCTION PROVIDER (V2)!";
433 cfp->registerCaseFunctions(
this);
470 bool has_error =
false;
480 XmlNode funcs_elem = case_root_elem.
child(cnn->functions);
483 String ustr_table(cnn->function_table);
484 String ustr_script(cnn->function_script);
486 if (functions_elem.
empty())
489 for(
XmlNode node : functions_elem ){
493 if (node.isNamed(ustr_table)){
494 ErrorInfo err_info = _readOneTable(node);
495 if (err_info.hasError()){
497 String table_name = node.attrValue(cnn->name_attribute);
498 if (table_name.
null())
499 error() <<
" Error in element '" << node.xpathFullName() <<
"' : "
500 << err_info.errorMessage();
502 error() <<
" Error in table named '" << table_name <<
"' : "
503 << err_info.errorMessage();
506 else if (node.isNamed(
"external-assembly")){
507 String assembly_name = node.expectedChild(
"assembly-name").value();
508 String class_name = node.expectedChild(
"class-name").value();
509 _readOneDotNetFunction(assembly_name,class_name);
512 warning() <<
"Unknown node in functions: " << node.xpathFullName();
523 auto table =
dynamic_cast<CaseTable*
>(icf_ref.get());
525 log() <<
"Table <" << table->name() <<
"> own "
526 << table->nbElement() <<
" element(s)";
538 String func_name = func_elem.attrValue(cnn->name_attribute);
539 if (func_name.null())
540 return ErrorInfo(String::format(
"missing attribute '{0}'",cnn->name_attribute));
542 cfbi.m_name = func_name;
544 return ErrorInfo(String::format(
"function '{0}' is defined several times",func_name));
546 String param_name = func_elem.attrValue(cnn->function_parameter);
547 if (param_name.null())
548 return ErrorInfo(String::format(
"missing attribute '{0}'",cnn->function_parameter));
550 String value_name = func_elem.attrValue(cnn->function_value);
551 if (value_name.null())
552 return ErrorInfo(String::format(
"missing attribute '{0}'",cnn->function_value));
554 String comul_name = func_elem.attrValue(
"comul");
555 String transform_x_name = func_elem.attrValue(
"comul-x");
557 cfbi.m_transform_param_func = transform_x_name;
558 cfbi.m_transform_value_func = comul_name;
560 String ustr_time(cnn->time_type);
561 String ustr_iteration(cnn->iteration_type);
563 String ustr_real(cnn->real_type);
564 String ustr_real3(cnn->real3_type);
565 String ustr_bool(cnn->bool_type);
566 String ustr_integer(cnn->integer_type);
567 String ustr_string(cnn->string_type);
569 UniqueArray<String> valid_param_strs = { ustr_time, ustr_real, ustr_iteration, ustr_integer };
573 if (param_name==ustr_time || param_name==ustr_real)
575 else if (param_name==ustr_iteration || param_name==ustr_integer)
578 return ErrorInfo(String::format(
"invalid value '{0}' for attribute '{1}'. Valid values are '{2}'.",
579 param_name,cnn->function_parameter,String::join(
", ",valid_param_strs)));
581 cfbi.m_param_type = param_type;
583 UniqueArray<String> valid_value_strs = { ustr_real, ustr_real3, ustr_integer, ustr_bool, ustr_string };
587 if (value_name==ustr_real)
589 if (value_name==ustr_integer)
591 if (value_name==ustr_bool)
593 if (value_name==ustr_string)
595 if (value_name==ustr_real3)
598 return ErrorInfo(String::format(
"invalid value '{0}' for attribute '{1}'. Valid values are '{2}'.",
599 value_name,cnn->function_value,String::join(
", ",valid_value_strs)));
600 cfbi.m_value_type = value_type;
603 String deltat_coef_str = func_elem.attrValue(cnn->function_deltat_coef);
604 Real deltat_coef = 0.0;
605 if (!deltat_coef_str.null()){
606 if (builtInGetValue(deltat_coef,deltat_coef_str))
607 return ErrorInfo(String::format(
"Invalid value '{0}' for attribute '{1}. Can not convert to 'Real' type",
608 deltat_coef_str,cnn->function_deltat_coef));
609 cfbi.m_deltat_coef = deltat_coef;
610 info() <<
"Coefficient deltat for the function '" << func_name <<
"' = " << cfbi.m_deltat_coef;
620_readOneTable(
const XmlNode& func_elem)
622 CaseFunctionBuildInfo cfbi(
traceMng());
624 ErrorInfo err_info = _checkValidFunction(func_elem,cfbi);
625 if (err_info.hasError())
630 String ustr_constant(cnn->function_constant);
631 String ustr_linear(cnn->function_linear);
632 String ustr_value(cnn->function_value);
634 String interpolation_name = func_elem.attrValue(cnn->function_interpolation);
635 if (interpolation_name.null())
636 return ErrorInfo(String::format(
"missing attribute '{0}'",cnn->function_interpolation));
640 if (interpolation_name==ustr_constant)
642 else if (interpolation_name==ustr_linear)
645 return ErrorInfo(String::format(
"Invalid value for attribute '{0}'. Valid values are '{1}' or '{2}'",
646 cnn->function_interpolation,ustr_constant,ustr_linear));
650 XmlNodeList func_value_list = func_elem.children(ustr_value);
651 Integer nb_func_value = func_value_list.size();
652 if (nb_func_value==0)
653 return ErrorInfo(
"The table has no values");
655 auto func =
new CaseTable(cfbi,interpolation_type);
662 for(
const auto& i : func_value_list ) {
663 String param_str = i.child(ustr_x).value();
664 String value_str = i.child(ustr_y).value();
667 if (param_str.null())
668 return ErrorInfo(String::format(
"index={0} element <x> is missing",value_index));
669 if (value_str.null())
670 return ErrorInfo(String::format(
"index={0} element <y> is missing",value_index));
674 if (error_number!=CaseTable::ErrNo){
675 String message =
"No info";
676 switch(error_number){
678 message = String::format(
"parameter '{0}' can not be converted to the 'param' type of the table",param_str);
681 message = String::format(
"value '{0}' can not be converted to the 'value' type of the table",value_str);
684 message =
"<x> lesser than previous <x>";
687 message =
"<x> greater than next <x>";
690 message =
"bad interval";
692 case CaseTable::ErrNo:
696 return ErrorInfo(String::format(
"index={0} : {1}",value_index,message));
707_readOneDotNetFunction(
const String& assembly_name,
const String& class_name)
711 if (!m_dotnet_provider.get()){
712 ServiceBuilder<ICaseFunctionDotNetProvider> sb(
subDomain());
713 m_dotnet_provider = sb.createReference(
"ArcaneDefaultDotNetCaseFunctionProvider",
SB_AllowNull);
714 if (!m_dotnet_provider.get())
715 ARCANE_FATAL(
"Can not create '.Net' case function provider. Check that the '.Net' runtime is loaded.");
718 m_dotnet_provider->registerCaseFunctions(
this,assembly_name,class_name);
735 co->addInvalidChildren(invalid_elems);
742 m_allow_unknown_root_element =
true;
748 if (mesh_elements.size()>0)
749 mesh_element_name = mesh_elements[0].name();
753 String name = node.name();
756 if (name==arcane_element_name || name==function_element_name)
758 if (!mesh_element_name.
null() && name==mesh_element_name)
760 bool is_found =
false;
762 if (co->rootTagName()==name){
768 if (m_allow_unknown_root_element)
769 pwarning() <<
"-- Unknown root option '" << node.xpathFullName() <<
"'";
771 invalid_elems.
add(node);
775 if (!doc_fragment->hasError()){
776 if (!invalid_elems.
empty()){
777 for(
XmlNode xnode : invalid_elems ){
778 perror() <<
"-- Unknown root option '" << xnode.xpathFullName() <<
"'";
780 pfatal() <<
"Unknown root option(s) in the input data. "
781 <<
"You can put these options inside <comment> tags to remove this error";
790_readOptions(
bool is_phase1)
794 co->read(read_phase);
803 m_options_with_function.clear();
804 UniqueArray<CaseOptionBase*> col;
806 co->deepGetChildren(col);
808 for( CaseOptionBase* co : col ){
810 m_options_with_function.add(co);
822 String lang = _noNullCaseDocument()->fragment()->language();
824 auto v = createPrintCaseDocumentVisitor(
traceMng(),lang);
825 info() <<
"-----------------------------------------------------";
827 info() <<
"Input data values:";
833 const bool use_old =
true;
836 co->printChildren(lang,0);
841 info() <<
"-----------------------------------------------------";
855 Real t = current_time;
857 Real to_add = deltat_coef * current_deltat;
860 co->updateFromFunction(t,current_iteration);
868findFunctionRef(
const String& name)
const
871 if (func_ref->name()==name)
882 return findFunctionRef(name).get();
891 _removeFunction(func,
false);
900 _removeFunction(func,do_free);
910 ARCANE_UNUSED(do_delete);
912 bool is_found =
false;
945 _readCaseDocument(filename,case_bytes);
947 return m_case_document.get();
956 if (m_case_document.
get())
962 String printed_filename = filename;
966 info() <<
"XML Memory File:";
968 pfatal() <<
"Failed to analyze the input data " << printed_filename;
976 XmlNode root_elem = m_case_document->fragment()->rootElement();
977 if (root_elem.name()!=cnn->root){
978 pfatal() <<
"The root element <" << root_elem.name() <<
"> has to be <" << cnn->root <<
">";
981 if (root_elem.attrValue(cnn->code_name)!=code_name){
982 pfatal() <<
"The file is not a case of code '" << code_name <<
"'";
985 String case_codeversion = root_elem.attrValue(cnn->code_version);
988 if (case_codeversion!=code_version && case_codeversion!=code_version2){
989 if (!
m_sub_domain->session()->checkIsValidCaseVersion(case_codeversion))
990 pfatal() <<
"The version number of the file (" << case_codeversion
991 <<
") doesn't match the version of the code '"
992 << code_name <<
"' (" << code_version <<
").";
1008 reader.addOption(opt);
1009 reader.read(is_phase1);
1011 opt->addInvalidChildren(invalid_elems);
1012 _printErrors(doc,is_phase1);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
const String & codeName() const
Retourne le nom du code de calcul lié l'application.
Tableau d'items de types quelconques.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Classe gérant la traduction d'un jeu de données dans une autre langue.
Informations pour construire une instance de CaseFunction.
void internalReadOneOption(ICaseOptions *opt, bool is_phase1) override
Implémentation via ICaseMngInternal.
void setAllowUnkownRootElelement(bool v) override
Positionne l'autorisation des éléments inconnus à la racine du document.
void readOptions(bool is_phase1) override
Lit les options du jeu de donnée correspondant aux modules utilisés.
CaseFunctionList m_functions
Liste des fonctions.
bool m_is_function_read
Indique si les fonctions ont déjà été lues.
IObservable * observable(eCaseMngEventType type) override
Observable sur l'instance.
IApplication * application() override
Application associée.
void printOptions() override
Affiche les valeurs des options.
ISubDomain * subDomain() override
Gestionnaire de sous-domaine.
bool isTreatWarningAsError() const override
Indique si les avertissements dans le jeu de données doivent être traités comme des erreurs et provoq...
bool isAllowUnkownRootElelement() const override
Indique si les éléments inconnus à la racine du document sont autorisés.
ISubDomain * m_sub_domain
Gestionnaire de sous-domain.
void registerOptions(ICaseOptions *) override
Enregistre une liste d'options du jeu de donnée.
ICaseFunction * findFunction(const String &name) const override
Retourne la fonction de nom name ou nullptr s'il n'y en a pas.
const ParameterListWithCaseOption & parameters() const
Liste des paramètres pouvant surcharger le jeu de données.
ITraceMng * traceMng() override
Gestionnaire de traces.
void unregisterOptions(ICaseOptions *) override
Déseregistre une liste d'options du jeu de donnée.
void removeFunction(ICaseFunction *func, bool dofree) override
Supprime une fonction.
ICaseDocumentFragment * createDocumentFragment(IXmlDocumentHolder *document) override
Crée un fragment.
CaseOptionsList m_case_options_list
Liste des options du cas.
void setTreatWarningAsError(bool v) override
Positionne la manière de traiter les avertissements.
CaseOptionsCollection blocks() const override
Collection des blocs d'options.
void updateOptions(Real current_time, Real current_deltat, Integer current_iteration) override
Met à jour les options basée sur une table de marche en temps.
IMeshMng * meshMng() const override
Gestionnaire de maillage associé
CaseFunctionCollection functions() override
Retourne la liste des tables.
IPhysicalUnitSystem * physicalUnitSystem() const override
Système d'unité associé.
ICaseDocument * readCaseDocument(const String &filename, ByteConstArrayView bytes) override
Lit le document XML du jeu de données.
ICaseDocument * caseDocument() override
Document XML du jeu de données (peut être nul si pas de jeu de donneés)
ICaseMngInternal * _internalImpl() override
Implémentation interne.
void _searchInvalidOptions()
Recherche les options invalides du jeu de données.
void readFunctions() override
Lit les tables du jeu de donnée.
ICaseDocumentFragment * caseDocumentFragment() override
Fragment du Document XML associé au jeu de données (peut être nul si pas de jeu de donneés)
void addFunction(ICaseFunction *func) override
Ajoute la fonction func.
Noms des noeuds XML d'un jeu de données Arcane.
Classe de base d'une option du jeu de donnée.
eCurveType
Type de la courbe de la table.
@ CurveUnknown
Type de courbe inconnu.
@ CurveLinear
Courbe linéaire par morceau.
@ CurveConstant
Courbe constante par morceau.
eError
Type des erreurs retournées par la classe.
@ ErrCanNotConvertParamToRightType
Indique que la conversion du paramètre vers le type souhaité est impossible.
@ ErrBadRange
Indique qu'un indice d'un élément n'est pas valide.
@ ErrNotGreaterThanPrevious
Indique que le paramètre n'est pas supérieur au précédent.
@ ErrNotLesserThanNext
Indique que le paramètre n'est pas inférieur au suivant.
@ ErrCanNotConvertValueToRightType
Indique que la conversion de la valeur vers le type souhaité est impossible.
Section critique en multi-thread.
Interface de l'application.
virtual IMainFactory * mainFactory() const =0
Manufacture principale.
virtual String mainVersionStr() const =0
Numéro de version principal (sans la béta) de l'application.
virtual String majorAndMinorVersionStr() const =0
Numéro de version majeur et mineure sous la forme M.m.
virtual IParallelSuperMng * parallelSuperMng()=0
Gestionnaire superviseur du parallélisme.
virtual const ApplicationInfo & applicationInfo() const =0
Informations sur l'exécutable.
Interface d'une partie d'un jeu de données.
virtual CaseNodeNames * caseNodeNames()=0
Retourne l'instance contenant les noms des noeuds XML par langage.
virtual XmlNode rootElement()=0
Retourne l'élément racine.
virtual String language() const =0
Langage utilisé dans le jeu de données.
virtual void clearErrorsAndWarnings()=0
Supprime les messages d'erreurs et d'avertissements enregistrés.
Interface d'une classe gérant un document XML du jeu de données.
virtual XmlNode functionsElement()=0
Retourne l'élément racine des fonctions.
virtual const XmlNodeList & meshElements()=0
Retourne l'élément racine des informations de maillage.
virtual XmlNode arcaneElement()=0
Retourne l'élément des informations pour Arcane.
virtual ICaseDocumentFragment * fragment()=0
Fragment correspondant à ce document.
virtual CaseNodeNames * caseNodeNames()=0
Retourne l'instance contenant les noms des noeuds XML par langage.
Interface d'une fonction du jeu de données.
virtual Real deltatCoef() const =0
Valeur du coefficient multiplicateur du deltat.
eParamType
Type d'un paramètre d'une fonction.
@ ParamUnknown
Type de paramètre inconnu.
@ ParamReal
Paramètre de type Real.
@ ParamInteger
Paramètre de type Integer.
eValueType
Type d'une valeur d'une fonction.
@ ValueReal3
Valeur de type 'Real3'.
@ ValueUnknown
Type de la valeur inconnu.
@ ValueInteger
Valeur de type entière.
@ ValueString
Valeur de type chaîne de caractères.
@ ValueReal
Valeur de type réelle.
@ ValueBool
Valeur de type entière.
Partie interne de ICaseMng.
Interface du gestionnaire de cas.
Interface d'une liste d'options du jeu de données.
virtual IModule * caseModule() const =0
Retourne le module associé ou nullptr s'il n'y en a pas.
virtual String rootTagName() const =0
Nom de l'élément dans le langage du jeu de données.
Interface du gestionnaire des entrées sorties.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Lit et analyse le fichier XML contenu dans le buffer buffer.
virtual ICaseDocument * createCaseDocument(IApplication *)=0
Crée une instance d'un document du jeu de données.
Interface du gestionnaire des maillages.
virtual bool used() const =0
true si le module est utilisé.
Interface d'un observable.
virtual IIOMng * ioMng() const =0
Gestionnaire des entrées/sorties.
Classe abstraite du superviseur de parallélisme.
virtual IThreadMng * threadMng() const =0
Gestionnaire de thread.
Interface d'un système d'unité.
Interface du gestionnaire d'un sous-domaine.
virtual IApplication * application()=0
Application.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
Interface du gestionnaire de traces.
Gestionnaire d'un document DOM.
Implémentation d'une collection d'éléments sous forme de vecteur.
Liste de paramètres avec informations pour surcharger les options du jeu de données.
T * get() const
Retourne l'objet référé par l'instance.
Référence à une instance.
static ThatClass create(InstanceType *t)
Créé une référence à partir de l'instance t.
Implémentation thread-safe d'un compteur de référence.
Encapsulation d'un pointeur qui se détruit automatiquement.
Informations pour créer un service.
Classe utilitaire pour retrouver un ou plusieurs services implémentant l'interface InterfaceType.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
void writeBytes(std::ostream &o) const
Écrit la chaîne au format UTF-8 sur le flot o.
static String collapseWhiteSpace(const String &rhs)
Effectue une normalisation des caractères espaces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage pfatal() const
Flot pour un message d'erreur fatale en parallèle.
TraceMessage log() const
Flot pour un message de log.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage perror() const
TraceMessage pwarning() const
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
Liste de noeuds d'un arbre DOM.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
@ ELEMENT
The node is an Element.
String name() const
Nom du noeud.
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ SB_AllowNull
Autorise l'absence du service.
eCaseOptionReadPhase
Phases de la lecture.
eCaseMngEventType
Types des évènements supportés par ICaseMng.
@ BeginReadOptionsPhase2
Évènement généré avant de lire les options dans la phase 2.
@ BeginReadOptionsPhase1
Évènement généré avant de lire les options dans la phase 1.
Int32 Integer
Type représentant un entier.
List< ICaseOptions * > CaseOptionsList
Tableau d'options du jeu de données.
Collection< ICaseOptions * > CaseOptionsCollection
Collection d'options du jeu de données.
double Real
Type représentant un réel.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.