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();
341 DataType d = DataType();
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);
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");
723 pm->registerProperties(*
this);
744 pm->registerProperties(*
this);
794 m_p->setScalarValue(
aname,value);
816 return m_p->getScalarValue(
aname,value);
825 m_p->setScalarValue(
aname,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);
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);
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;
Tableau d'items de types quelconques.
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.
Interface d'un type de propriété.
virtual ~IPropertyType()
Libère les ressources.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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 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 pwarning() const
TraceMessage info() const
Flot pour un message d'information.
-*- 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.