14#include "arcane/Properties.h"
16#include "arcane/utils/String.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/TraceAccessor.h"
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/FatalErrorException.h"
23#include "arcane/core/datatype/SmallVariant.h"
24#include "arcane/core/datatype/DataTypeTraits.h"
26#include "arcane/core/IPropertyMng.h"
27#include "arcane/core/ISerializer.h"
60 static const int NB_TYPE = 11;
64 : m_int32(0), m_int64(0), m_real(0), m_bool(0), m_string(0), m_is_scalar(
false), m_type(PV_None)
79 PropertyVariant* p =
new PropertyVariant();
81 p->m_type = PV_ArrayInt32;
87 PropertyVariant* p =
new PropertyVariant();
89 p->m_type = PV_ArrayInt64;
95 PropertyVariant* p =
new PropertyVariant();
97 p->m_type = PV_ArrayReal;
103 PropertyVariant* p =
new PropertyVariant();
105 p->m_type = PV_ArrayBool;
111 PropertyVariant* p =
new PropertyVariant();
113 p->m_type = PV_ArrayString;
119 PropertyVariant* p =
new PropertyVariant();
120 p->m_is_scalar =
true;
123 case SmallVariant::TUnknown: p->m_type = PV_None;
break;
124 case SmallVariant::TReal: p->m_type = PV_ScalarReal;
break;
125 case SmallVariant::TInt32: p->m_type = PV_ScalarInt32;
break;
126 case SmallVariant::TInt64: p->m_type = PV_ScalarInt64;
break;
127 case SmallVariant::TBool: p->m_type = PV_ScalarBool;
break;
128 case SmallVariant::TString: p->m_type = PV_ScalarString;
break;
165 eType type()
const {
return m_type; }
187 virtual void print(std::ostream& o,PropertyVariant* v) =0;
188 virtual const String& typeName()
const =0;
189 virtual void serializeReserve(ISerializer* s,PropertyVariant* v) =0;
190 virtual void serializePut(ISerializer* s,PropertyVariant* v) =0;
199template<
typename DataType>
200void _directPutScalar(
ISerializer* s,
const DataType& value)
205void _directPutScalar(
ISerializer* s,
const bool& value)
210template<
typename DataType>
211void _directReserveScalar(
ISerializer* s,
const DataType&)
221template<
typename DataType>
231 Int64 n = values.size();
239 Int64 n = values.size();
241 s->reserve(values[i]);
244template<
typename DataType>
247 s->putInt64(values.size());
253 Int64 n = values.size();
256 for(
Int64 i=0; i<n; ++i )
257 bytes[i] = values[i] ? 1 : 0;
264 Int64 n = values.size();
270template<
typename DataType>
273 Int64 n = s->getInt64();
281 Int64 n = s->getInt64();
288 values[i] = (bytes[i]!=0);
293 Int64 n = s->getInt64();
304template<
typename DataType>
305class ScalarPropertyType
320 DataType d = DataType();
325 const String& typeName()
const override
333 DataType d = DataType();
335 _directReserveScalar(s,d);
341 DataType d = DataType();
343 _directPutScalar(s,d);
353template<
typename DataType>
354class ArrayPropertyType
370 o <<
',' <<
'[' << i <<
"]=" << x->operator[](i);
374 virtual const String& typeName()
const
409 static const Int32 SERIALIZE_VERSION = 2;
413 typedef std::map<String,PropertyVariant*> MapType;
430 MapType m_property_map;
435 template<
typename DataType>
436 bool getScalarValue(
const String& name,DataType& value)
438 typename MapType::const_iterator v = m_property_map.find(name);
439 if (v==m_property_map.end()){
443 SmallVariant* x = v->second->getScalar();
445 throw ArgumentException(A_FUNCINFO,
"Bad data dimension for property (expecting scalar but property is array)");
450 template<
typename DataType>
451 void _setScalarValue(SmallVariant& s,
const DataType& value)
453 s.setValueAll(value);
455 void _setScalarValue(SmallVariant& s,
const String& value)
460 template<
typename DataType>
461 DataType setScalarValue(
const String& name,
const DataType& value)
463 DataType old_value = DataType();
464 MapType::iterator v = m_property_map.find(name);
465 if (v!=m_property_map.end()){
466 SmallVariant* x = v->second->getScalar();
468 throw ArgumentException(A_FUNCINFO,
"Bad data dimension for property (expecting scalar but property is array)");
471 _setScalarValue(*x,value);
475 _setScalarValue(sv,value);
476 m_property_map.insert(std::make_pair(name,PropertyVariant::create(sv)));
481 template<
typename DataType>
482 void setArrayValue(
const String& name,ConstArrayView<DataType> value)
484 MapType::iterator v = m_property_map.find(name);
485 if (v!=m_property_map.end()){
486 UniqueArray<DataType>* x = v->second->get(DataType());
488 throw ArgumentException(A_FUNCINFO,
"Bad datatype for property");
492 m_property_map.insert(std::make_pair(name,PropertyVariant::create(value)));
496 template<
typename DataType>
497 void getArrayValue(
const String& name,Array<DataType>& value)
499 MapType::const_iterator v = m_property_map.find(name);
500 if (v==m_property_map.end()){
504 UniqueArray<DataType>* x = v->second->get(DataType());
506 throw ArgumentException(A_FUNCINFO,
"Bad datatype for property");
512 void print(std::ostream& o);
514 void serialize(ISerializer* serializer);
516 void serializeReserve(ISerializer* serializer);
517 void serializePut(ISerializer* serializer);
518 void serializeGet(ISerializer* serializer);
522 template<
typename DataType>
void
523 _serializeGetArray(ISerializer* serializer,
const String& name,
const DataType&)
525 UniqueArray<DataType> values;
526 _directGet(serializer,values);
527 setArrayValue(name,values.constView());
538, m_parent_property(0)
542 m_types.resize(PropertyVariant::NB_TYPE);
544 m_types[PropertyVariant::PV_ScalarReal] =
new ScalarPropertyType<Real>();
545 m_types[PropertyVariant::PV_ScalarInt32] =
new ScalarPropertyType<Int32>();
546 m_types[PropertyVariant::PV_ScalarInt64] =
new ScalarPropertyType<Int64>();
547 m_types[PropertyVariant::PV_ScalarBool] =
new ScalarPropertyType<bool>();
548 m_types[PropertyVariant::PV_ScalarString] =
new ScalarPropertyType<String>();
550 m_types[PropertyVariant::PV_ArrayReal] =
new ArrayPropertyType<Real>();
551 m_types[PropertyVariant::PV_ArrayInt32] =
new ArrayPropertyType<Int32>();
552 m_types[PropertyVariant::PV_ArrayInt64] =
new ArrayPropertyType<Int64>();
553 m_types[PropertyVariant::PV_ArrayBool] =
new ArrayPropertyType<bool>();
554 m_types[PropertyVariant::PV_ArrayString] =
new ArrayPropertyType<String>();
563 MapType::iterator v = m_property_map.begin();
564 MapType::iterator vend = m_property_map.end();
565 for( ; v!=vend; ++v )
568 for(
Integer i=0, n=m_types.size(); i<n; ++i )
571 info(5) <<
"DESTROY PROPERTY name=" << m_name <<
" this=" <<
this;
578print(std::ostream& o)
580 MapType::iterator v = m_property_map.begin();
581 MapType::iterator vend = m_property_map.end();
582 for( ; v!=vend; ++v ){
583 PropertyVariant* p = v->second;
584 PropertyVariant::eType et = p->type();
585 IPropertyType* pt = m_types[et];
586 o <<
" " << v->first <<
" = ";
588 o <<
"(" << pt->typeName();
605 switch(serializer->mode()){
606 case ISerializer::ModeReserve:
607 serializeReserve(serializer);
610 serializePut(serializer);
613 serializeGet(serializer);
624 serializer->reserveInt32(1);
625 serializer->reserveInt64(1);
627 MapType::iterator v = m_property_map.begin();
628 MapType::iterator vend = m_property_map.end();
629 for( ; v!=vend; ++v ){
630 PropertyVariant* p = v->second;
631 PropertyVariant::eType et = p->type();
632 serializer->reserveInt32(1);
633 serializer->reserve(v->first);
634 IPropertyType* pt = m_types[et];
635 pt->serializeReserve(serializer,p);
645 serializer->putInt32(SERIALIZE_VERSION);
648 serializer->putInt64(n);
650 MapType::iterator v = m_property_map.begin();
651 MapType::iterator vend = m_property_map.end();
652 for( ; v!=vend; ++v ){
653 PropertyVariant* p = v->second;
654 PropertyVariant::eType et = p->type();
655 IPropertyType* pt = m_types[et];
656 serializer->putInt32(et);
657 serializer->put(v->first);
658 pt->serializePut(serializer,p);
668 Int64 version = serializer->getInt32();
669 if (version!=SERIALIZE_VERSION){
674 pwarning() <<
"Can not reading properties from imcompatible checkpoint";
678 Int64 n = serializer->getInt64();
681 Int32 type = serializer->getInt32();
682 serializer->get(name);
686 case PropertyVariant::PV_ScalarReal: setScalarValue(name,serializer->getReal());
break;
687 case PropertyVariant::PV_ScalarInt32:setScalarValue(name,serializer->getInt32());
break;
688 case PropertyVariant::PV_ScalarInt64:setScalarValue(name,serializer->getInt64());
break;
689 case PropertyVariant::PV_ScalarBool: setScalarValue(name,(
bool)serializer->getByte());
break;
690 case PropertyVariant::PV_ScalarString: { String str; serializer->get(str); setScalarValue(name,str); }
break;
692 case PropertyVariant::PV_ArrayReal: _serializeGetArray(serializer,name,
Real());
break;
693 case PropertyVariant::PV_ArrayInt32:_serializeGetArray(serializer,name,
Int32());
break;
694 case PropertyVariant::PV_ArrayInt64:_serializeGetArray(serializer,name,
Int64());
break;
695 case PropertyVariant::PV_ArrayBool:_serializeGetArray(serializer,name,
bool());
break;
696 case PropertyVariant::PV_ArrayString:_serializeGetArray(serializer,name,String());
break;
698 throw FatalErrorException(A_FUNCINFO,
"Bad type");
715 bool has_create =
false;
723 pm->registerProperties(*
this);
736 bool has_create =
false;
744 pm->registerProperties(*
this);
794 m_p->setScalarValue(aname,value);
804 bool v = default_value;
814get(
const String& aname,
bool& value)
const
816 return m_p->getScalarValue(aname,value);
825 m_p->setScalarValue(aname,value);
835 Int32 v = default_value;
836 m_p->getScalarValue(
name,v);
847 return m_p->getScalarValue(
name,value);
857 m_p->setScalarValue(aname,value);
867 Int64 v = default_value;
868 m_p->getScalarValue(aname,v);
879 return m_p->getScalarValue(aname,value);
894 m_p->getScalarValue(aname,x);
909 m_p->setScalarValue(aname,value);
919 Real v = default_value;
920 m_p->getScalarValue(aname,v);
931 return m_p->getScalarValue(aname,value);
940 m_p->setScalarValue(aname,value);
951 m_p->getScalarValue(aname,v);
962 return m_p->getScalarValue(aname,value);
971 m_p->setArrayValue(aname,value);
976 m_p->getArrayValue(aname,value);
985 m_p->setArrayValue(aname,value);
990 m_p->getArrayValue(aname,value);
999 m_p->setArrayValue(aname,value);
1004 m_p->getArrayValue(aname,value);
1013 m_p->setArrayValue(aname,value);
1018 m_p->getArrayValue(aname,value);
1027 m_p->setArrayValue(aname,value);
1032 m_p->getArrayValue(aname,value);
1039print(std::ostream& o)
const
1050 m_p->serialize(serializer);
1068 return m_p->m_full_name;
1077 return m_p->m_property_mng;
Integer size() const
Nombre d'éléments du vecteur.
Classe de base des vecteurs 1D de données.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Interface du gestionnaire des propriétés.
virtual void destroyProperties(const Properties &p)=0
Supprime les propriétés référencées par p.
virtual ~IPropertyType()
Libère les ressources.
Interface d'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual void deleteMe()
Détruit l'objet référencé
Int64 getInt64(const String &name) const
Valeur de la propriété de nom name.
bool get(const String &name, bool &value) const
Valeur de la propriété de nom name.
bool getBoolWithDefault(const String &name, bool default_value) const
Valeur de la propriété de nom name.
const String & name() const
Nom de la propriété.
Int32 getInt32WithDefault(const String &name, Int32 default_value) const
Valeur de la propriété de nom name.
Int32 getInt32(const String &name) const
Valeur de la propriété de nom name.
Integer getInteger(const String &name) const
Valeur de la propriété de nom name.
Integer getIntegerWithDefault(const String &name, Integer default_value) const
Valeur de la propriété de nom name.
bool getBool(const String &name) const
Valeur de la propriété de nom name.
void setInteger(const String &name, Integer value)
Positionne une propriété de type Integer de nom name et de valeur value.
void setInt64(const String &name, Int64 value)
Positionne une propriété de type Int64 de nom name et de valeur value.
void destroy()
Supprime les valeurs associées des propriétés associées à cette référence.
Real getReal(const String &name) const
Valeur de la propriété de nom name.
void setInt32(const String &name, Int32 value)
Positionne une propriété de type Int32 de nom name et de valeur value.
Int64 getInt64WithDefault(const String &name, Int64 default_value) const
Valeur de la propriété de nom name.
void set(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
String getString(const String &name) const
Valeur de la propriété de nom name.
Real getRealWithDefault(const String &name, Real default_value) const
Valeur de la propriété de nom name.
const Properties & operator=(const Properties &rhs)
Opérateur de recopie.
String getStringWithDefault(const String &name, const String &default_value) const
Valeur de la propriété de nom name.
void serialize(ISerializer *serializer)
Effectue la sérialisation des propriétés.
Properties(IPropertyMng *pm, const String &name)
Créé ou récupère une liste de propriétés de nom name.
virtual ~Properties()
Détruit la référence à cette propriété
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
void setString(const String &name, const String &value)
Positionne une propriété de type String de nom name et de valeur value.
const String & fullName() const
Nom complet de la propriété.
void print(std::ostream &o) const
Sort les propriétés et leurs valeurs sur le flot o.
void setReal(const String &name, Real value)
Positionne une propriété de type Real de nom name et de valeur value.
Classe gérant un type polymorphe.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage pwarning() const
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
ConstArrayView< String > StringConstArrayView
Equivalent C d'un tableau à une dimension de chaînes de caractères.
Array< String > StringArray
Tableau dynamique à une dimension de chaînes de caractères.
Array< bool > BoolArray
Tableau dynamique à une dimension de booléens.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
ConstArrayView< bool > BoolConstArrayView
Equivalent C d'un tableau à une dimension de booléens.
@ Byte
Donnée de type octet.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
double Real
Type représentant un réel.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Array< Real > RealArray
Tableau dynamique à une dimension de réels.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.