diff options
author | Joe George <joe@zeroc.com> | 2015-12-08 11:33:42 -0500 |
---|---|---|
committer | Joe George <joe@zeroc.com> | 2015-12-08 16:09:24 -0500 |
commit | 6a43686ce26de5d2d5edf4a485ecff3a242c26b6 (patch) | |
tree | d31e4f16dc9ed6e28056a7224e045a4638955f5e /python/modules/IcePy/ObjectFactory.cpp | |
parent | C++11 mapping IceDiscovery plug-in (diff) | |
download | ice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.tar.bz2 ice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.tar.xz ice-6a43686ce26de5d2d5edf4a485ecff3a242c26b6.zip |
ICE-6908 - Add ValueFactory
ValueFactory is a replacement for ObjectFactory (which is still
available if needed). It is an interface with only one operation
and can has the "delegate" metadata.
Diffstat (limited to 'python/modules/IcePy/ObjectFactory.cpp')
-rw-r--r-- | python/modules/IcePy/ObjectFactory.cpp | 73 |
1 files changed, 50 insertions, 23 deletions
diff --git a/python/modules/IcePy/ObjectFactory.cpp b/python/modules/IcePy/ObjectFactory.cpp index 1829d32956b..d3720714a29 100644 --- a/python/modules/IcePy/ObjectFactory.cpp +++ b/python/modules/IcePy/ObjectFactory.cpp @@ -25,7 +25,8 @@ IcePy::ObjectFactory::ObjectFactory() IcePy::ObjectFactory::~ObjectFactory() { - assert(_factoryMap.empty()); + assert(_valueFactoryMap.empty()); + assert(_objectFactoryMap.empty()); } Ice::ObjectPtr @@ -39,8 +40,8 @@ IcePy::ObjectFactory::create(const string& id) { Lock sync(*this); - FactoryMap::iterator p = _factoryMap.find(id); - if(p != _factoryMap.end()) + FactoryMap::iterator p = _valueFactoryMap.find(id); + if(p != _valueFactoryMap.end()) { factory = p->second; } @@ -112,12 +113,15 @@ IcePy::ObjectFactory::create(const string& id) void IcePy::ObjectFactory::destroy() { - FactoryMap factories; + FactoryMap valueFactories; + FactoryMap objectFactories; { Lock sync(*this); - factories = _factoryMap; - _factoryMap.clear(); + objectFactories = _objectFactoryMap; + valueFactories = _valueFactoryMap; + _valueFactoryMap.clear(); + _objectFactoryMap.clear(); } // @@ -126,66 +130,89 @@ IcePy::ObjectFactory::destroy() // AdoptThread adoptThread; - for(FactoryMap::iterator p = factories.begin(); p != factories.end(); ++p) + for(FactoryMap::iterator p = _objectFactoryMap.begin(); p != _objectFactoryMap.end(); ++p) { // - // Invoke the destroy method on each registered Python factory. + // Invoke the destroy method on each registered Python "object" factory. // PyObjectHandle obj = PyObject_CallMethod(p->second, STRCAST("destroy"), 0); PyErr_Clear(); // Ignore errors. Py_DECREF(p->second); } + for(FactoryMap::iterator p = _valueFactoryMap.begin(); p != _valueFactoryMap.end(); ++p) + { + PyErr_Clear(); // Ignore errors. + Py_DECREF(p->second); + } } bool -IcePy::ObjectFactory::add(PyObject* factory, const string& id) +IcePy::ObjectFactory::addValueFactory(PyObject* factory, const string& id) { Lock sync(*this); - FactoryMap::iterator p = _factoryMap.find(id); - if(p != _factoryMap.end()) + FactoryMap::iterator p = _valueFactoryMap.find(id); + if(p != _valueFactoryMap.end()) { Ice::AlreadyRegisteredException ex(__FILE__, __LINE__); - ex.kindOfObject = "object factory"; + ex.kindOfObject = "value factory"; ex.id = id; setPythonException(ex); return false; } - _factoryMap.insert(FactoryMap::value_type(id, factory)); + _valueFactoryMap.insert(FactoryMap::value_type(id, factory)); Py_INCREF(factory); return true; } bool -IcePy::ObjectFactory::remove(const string& id) +IcePy::ObjectFactory::addObjectFactory(PyObject* factory, const string& id) { Lock sync(*this); - FactoryMap::iterator p = _factoryMap.find(id); - if(p == _factoryMap.end()) + FactoryMap::iterator p = _valueFactoryMap.find(id); + if(p != _valueFactoryMap.end()) { - Ice::NotRegisteredException ex(__FILE__, __LINE__); - ex.kindOfObject = "object factory"; + Ice::AlreadyRegisteredException ex(__FILE__, __LINE__); + ex.kindOfObject = "value factory"; ex.id = id; setPythonException(ex); return false; } - Py_DECREF(p->second); - _factoryMap.erase(p); + _valueFactoryMap.insert(FactoryMap::value_type(id, factory)); + Py_INCREF(factory); + _objectFactoryMap.insert(FactoryMap::value_type(id, factory)); + Py_INCREF(factory); return true; } PyObject* -IcePy::ObjectFactory::find(const string& id) +IcePy::ObjectFactory::findValueFactory(const string& id) +{ + Lock sync(*this); + + FactoryMap::iterator p = _valueFactoryMap.find(id); + if(p == _valueFactoryMap.end()) + { + Py_INCREF(Py_None); + return Py_None; + } + + Py_INCREF(p->second); + return p->second; +} + +PyObject* +IcePy::ObjectFactory::findObjectFactory(const string& id) { Lock sync(*this); - FactoryMap::iterator p = _factoryMap.find(id); - if(p == _factoryMap.end()) + FactoryMap::iterator p = _objectFactoryMap.find(id); + if(p == _objectFactoryMap.end()) { Py_INCREF(Py_None); return Py_None; |