瀏覽代碼

Add option of sharing the RegisteredItems hash map

In order for multiple factories to NOT register an item with the same key,
they need to share the same hashmap
Julien Finet 14 年之前
父節點
當前提交
6200707bcc
共有 2 個文件被更改,包括 27 次插入7 次删除
  1. 7 3
      Libs/Core/ctkAbstractFactory.h
  2. 20 4
      Libs/Core/ctkAbstractFactory.tpp

+ 7 - 3
Libs/Core/ctkAbstractFactory.h

@@ -75,6 +75,7 @@ template<typename BaseClassType>
 class ctkAbstractFactory
 {
 public:
+  typedef QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > > HashType;
 
   /// Constructor/Desctructor
   explicit ctkAbstractFactory();
@@ -105,6 +106,9 @@ public:
   void setVerbose(bool value);
   bool verbose()const;
 
+  void setRegisteredItems(const QSharedPointer<HashType>& items);
+  QSharedPointer<HashType> registeredItems();
+
 protected:
 
   /// \brief Call the load method associated with the item.
@@ -114,14 +118,14 @@ protected:
   /// Get a Factory item given its itemKey. Return 0 if any.
   ctkAbstractFactoryItem<BaseClassType> * item(const QString& itemKey)const;
 
-  typedef typename QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > >::const_iterator ConstIterator;
-  typedef typename QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > >::iterator       Iterator;
+  typedef typename HashType::const_iterator ConstIterator;
+  typedef typename HashType::iterator       Iterator;
 
 private:
   ctkAbstractFactory(const ctkAbstractFactory &); /// Not implemented
   void operator=(const ctkAbstractFactory&); /// Not implemented
 
-  QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > > RegisteredItemMap;
+  QSharedPointer<HashType> RegisteredItemMap;
 
   bool Verbose;
 };

+ 20 - 4
Libs/Core/ctkAbstractFactory.tpp

@@ -100,6 +100,7 @@ template<typename BaseClassType>
 ctkAbstractFactory<BaseClassType>::ctkAbstractFactory()
 {
   this->Verbose = false;
+  this->RegisteredItemMap = QSharedPointer<HashType>(new HashType);
 }
 
 //----------------------------------------------------------------------------
@@ -142,7 +143,7 @@ QStringList ctkAbstractFactory<BaseClassType>::keys() const
 {
   // Since by construction, we checked if a name was already in the QHash,
   // there is no need to call 'uniqueKeys'
-  return this->RegisteredItemMap.keys();
+  return this->RegisteredItemMap->keys();
 }
 
 //----------------------------------------------------------------------------
@@ -177,7 +178,7 @@ bool ctkAbstractFactory<BaseClassType>::registerItem(const QString& key,
     }
   
   // Store its reference using a QSharedPointer
-  this->RegisteredItemMap[key] = _item;
+  this->RegisteredItemMap->insert(key, _item);
   return true;
 }
 
@@ -185,8 +186,8 @@ bool ctkAbstractFactory<BaseClassType>::registerItem(const QString& key,
 template<typename BaseClassType>
 ctkAbstractFactoryItem<BaseClassType> * ctkAbstractFactory<BaseClassType>::item(const QString& itemKey)const
 {
-  ConstIterator iter = this->RegisteredItemMap.find(itemKey);
-  if ( iter == this->RegisteredItemMap.constEnd())
+  ConstIterator iter = this->RegisteredItemMap->find(itemKey);
+  if ( iter == this->RegisteredItemMap->constEnd())
     {
     return 0;
     }
@@ -207,4 +208,19 @@ bool ctkAbstractFactory<BaseClassType>::verbose()const
   return this->Verbose;
 }
 
+//----------------------------------------------------------------------------
+template<typename BaseClassType>
+void ctkAbstractFactory<BaseClassType>::setRegisteredItems(const QSharedPointer<HashType>& items)
+{
+  this->RegisteredItemMap = items;
+}
+
+//----------------------------------------------------------------------------
+template<typename BaseClassType>
+QSharedPointer<typename ctkAbstractFactory<BaseClassType>::HashType>
+ctkAbstractFactory<BaseClassType>::registeredItems()
+{
+  return this->RegisteredItemMap;
+}
+
 #endif