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/datatype/SmallVariant.h"
24#include "arcane/datatype/DataTypeTraits.h"
26#include "arcane/IPropertyMng.h"
27#include "arcane/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)
81 p->m_type = PV_ArrayInt32;
89 p->m_type = PV_ArrayInt64;
97 p->m_type = PV_ArrayReal;
105 p->m_type = PV_ArrayBool;
113 p->m_type = PV_ArrayString;
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&)
213 s->reserve(DataTypeTraitsT<DataType>::type(),1);
216void _directReserveScalar(ISerializer* s,
const String& value)
221template<
typename DataType>
222void _directReserve(ISerializer* s,Span<const DataType> values)
225 s->reserveSpan(DataTypeTraitsT<DataType>::type(),values.size());
229void _directReserve(ISerializer* s,Span<const bool> values)
231 Int64 n = values.size();
236void _directReserve(ISerializer* s,Span<const String> values)
239 Int64 n = values.size();
240 for( Integer i=0; i<n; ++i )
241 s->reserve(values[i]);
244template<
typename DataType>
245void _directPut(ISerializer* s,Span<const DataType> values)
247 s->putInt64(values.size());
251void _directPut(ISerializer* s,Span<const bool> values)
253 Int64 n = values.size();
255 UniqueArray<Byte> bytes(n);
256 for( Int64 i=0; i<n; ++i )
257 bytes[i] = values[i] ? 1 : 0;
262void _directPut(ISerializer* s,Span<const String> values)
264 Int64 n = values.size();
266 for( Integer i=0; i<n; ++i )
270template<
typename DataType>
271void _directGet(ISerializer* s,Array<DataType>& values)
273 Int64 n = s->getInt64();
279void _directGet(ISerializer* s,Array<bool>& values)
281 Int64 n = s->getInt64();
284 UniqueArray<Byte> bytes(n);
287 for( Integer i=0; i<n; ++i )
288 values[i] = (bytes[i]!=0);
291void _directGet(ISerializer* s,Array<String>& values)
293 Int64 n = s->getInt64();
296 for( Integer i=0; i<n; ++i )
304template<
typename DataType>
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>
366 Integer n = x->
size();
369 for( Integer i=0; i<n; ++i )
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());
535PropertiesImpl(IPropertyMng* pm,
const String& name)
536: TraceAccessor(pm->traceMng())
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();
603serialize(ISerializer* serializer)
605 switch(serializer->mode()){
606 case ISerializer::ModeReserve:
607 serializeReserve(serializer);
610 serializePut(serializer);
613 serializeGet(serializer);
622serializeReserve(ISerializer* serializer)
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();
633 serializer->reserve(v->first);
634 IPropertyType* pt = m_types[et];
635 pt->serializeReserve(serializer,p);
643serializePut(ISerializer* serializer)
645 serializer->putInt32(SERIALIZE_VERSION);
647 Int64 n = (Int64)m_property_map.
size();
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);
666serializeGet(ISerializer* serializer)
668 Int64 version = serializer->getInt32();
669 if (version!=SERIALIZE_VERSION){
674 pwarning() <<
"Can not reading properties from imcompatible checkpoint";
678 Int64 n = serializer->getInt64();
680 for( Integer i=0; i<n; ++i ){
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);
845get(
const String& name,Int32& value)
const
847 return m_p->getScalarValue(
name,value);
857 m_p->setScalarValue(aname,value);
867 Int64 v = default_value;
868 m_p->getScalarValue(aname,v);
877get(
const String& aname,Int64& value)
const
879 return m_p->getScalarValue(aname,value);
893 Integer x = default_value;
894 m_p->getScalarValue(aname,x);
909 m_p->setScalarValue(aname,value);
919 Real v = default_value;
920 m_p->getScalarValue(aname,v);
929get(
const String& aname,Real& value)
const
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;
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.
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.
Integer size() const
Nombre d'éléments du vecteur.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Chaîne de caractères unicode.
Classe d'accès aux traces.
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 -*-
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Byte
Donnée de type octet.
double Real
Type représentant un réel.