From e69d39395db60a1edc0caad7a76c769f1b34628d Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Fri, 6 May 2016 10:23:10 +0200 Subject: [PATCH] MEDCoupling has now a simple global map. --- src/MEDCoupling/MEDCouplingRefCountObject.cxx | 83 +++++++++++++++++++ src/MEDCoupling/MEDCouplingRefCountObject.hxx | 21 +++++ .../MEDCouplingRefCountObject.i | 23 +++++ 3 files changed, 127 insertions(+) diff --git a/src/MEDCoupling/MEDCouplingRefCountObject.cxx b/src/MEDCoupling/MEDCouplingRefCountObject.cxx index 5eb43b9d1..c75f7934a 100644 --- a/src/MEDCoupling/MEDCouplingRefCountObject.cxx +++ b/src/MEDCoupling/MEDCouplingRefCountObject.cxx @@ -21,11 +21,15 @@ #include "MEDCouplingRefCountObject.hxx" #include "MEDCoupling_version.h" +#include "InterpKernelException.hxx" + #include #include using namespace MEDCoupling; +GlobalDict *GlobalDict::UNIQUE_INSTANCE=0; + const char *MEDCoupling::MEDCouplingVersionStr() { return MEDCOUPLING_VERSION_STR; @@ -273,3 +277,82 @@ RefCountObject::RefCountObject(const RefCountObject& other):RefCountObjectOnly(o RefCountObject::~RefCountObject() { } + +//= + +GlobalDict *GlobalDict::GetInstance() +{ + if(!UNIQUE_INSTANCE) + UNIQUE_INSTANCE=new GlobalDict; + return UNIQUE_INSTANCE; +} + +bool GlobalDict::hasKey(const std::string& key) const +{ + std::map::const_iterator it(_my_map.find(key)); + return it!=_my_map.end(); +} + +std::string GlobalDict::value(const std::string& key) const +{ + std::map::const_iterator it(_my_map.find(key)); + if(it==_my_map.end()) + { + std::ostringstream oss; + oss << "GlobalDict::value : key \"" << key << "\" is not in map !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + return (*it).second; +} + +std::vector GlobalDict::keys() const +{ + std::vector ret; + for(std::map::const_iterator it=_my_map.begin();it!=_my_map.end();it++) + ret.push_back((*it).first); + return ret; +} + +void GlobalDict::erase(const std::string& key) +{ + std::map::iterator it(_my_map.find(key)); + if(it==_my_map.end()) + { + std::ostringstream oss; + oss << "GlobalDict::erase : key \"" << key << "\" is not in map !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + _my_map.erase(it); +} + +void GlobalDict::clear() +{ + _my_map.clear(); +} + +void GlobalDict::setKeyValue(const std::string& key, const std::string& value) +{ + std::map::const_iterator it(_my_map.find(key)); + if(it!=_my_map.end()) + { + std::ostringstream oss; + oss << "GlobalDict::setKeyValue : key \"" << key << "\" already exists !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + _my_map[key]=value; +} + +void GlobalDict::setKeyValueForce(const std::string& key, const std::string& value) +{ + _my_map[key]=value; +} + +std::string GlobalDict::printSelf() const +{ + std::ostringstream oss; + for(std::map::const_iterator it=_my_map.begin();it!=_my_map.end();it++) + { + oss << "(" << (*it).first << "," << (*it).second << ")" << std::endl; + } + return oss.str(); +} diff --git a/src/MEDCoupling/MEDCouplingRefCountObject.hxx b/src/MEDCoupling/MEDCouplingRefCountObject.hxx index bba58608c..5130f1a2f 100644 --- a/src/MEDCoupling/MEDCouplingRefCountObject.hxx +++ b/src/MEDCoupling/MEDCouplingRefCountObject.hxx @@ -24,6 +24,7 @@ #include "MEDCoupling.hxx" #include +#include #include #include #include @@ -103,6 +104,26 @@ namespace MEDCoupling MEDCOUPLING_EXPORT RefCountObject(const RefCountObject& other); MEDCOUPLING_EXPORT virtual ~RefCountObject(); }; + + class GlobalDict + { + public: + MEDCOUPLING_EXPORT static GlobalDict *GetInstance(); + MEDCOUPLING_EXPORT bool hasKey(const std::string& key) const; + MEDCOUPLING_EXPORT std::string value(const std::string& key) const; + MEDCOUPLING_EXPORT std::vector keys() const; + MEDCOUPLING_EXPORT void erase(const std::string& key); + MEDCOUPLING_EXPORT void clear(); + MEDCOUPLING_EXPORT void setKeyValue(const std::string& key, const std::string& value); + MEDCOUPLING_EXPORT void setKeyValueForce(const std::string& key, const std::string& value); + MEDCOUPLING_EXPORT std::string printSelf() const; + private: + GlobalDict() { } + private: + static GlobalDict *UNIQUE_INSTANCE; + private: + std::map _my_map; + }; } #endif diff --git a/src/MEDCoupling_Swig/MEDCouplingRefCountObject.i b/src/MEDCoupling_Swig/MEDCouplingRefCountObject.i index aa8c5d9c9..fa29e6032 100644 --- a/src/MEDCoupling_Swig/MEDCouplingRefCountObject.i +++ b/src/MEDCoupling_Swig/MEDCouplingRefCountObject.i @@ -115,6 +115,29 @@ namespace MEDCoupling protected: ~RefCountObject(); }; + + class GlobalDict + { + public: + static GlobalDict *GetInstance() throw(INTERP_KERNEL::Exception); + bool hasKey(const std::string& key) const throw(INTERP_KERNEL::Exception); + std::string value(const std::string& key) const throw(INTERP_KERNEL::Exception); + std::vector keys() const throw(INTERP_KERNEL::Exception); + void erase(const std::string& key) throw(INTERP_KERNEL::Exception); + void clear() throw(INTERP_KERNEL::Exception); + void setKeyValue(const std::string& key, const std::string& value) throw(INTERP_KERNEL::Exception); + void setKeyValueForce(const std::string& key, const std::string& value) throw(INTERP_KERNEL::Exception); + private: + GlobalDict(); + public: + %extend + { + std::string __str__() const + { + return self->printSelf(); + } + } + }; } %inline -- 2.39.2