Browse Source

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 years ago
parent
commit
6200707bcc
2 changed files with 27 additions and 7 deletions
  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
 class ctkAbstractFactory
 {
 {
 public:
 public:
+  typedef QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > > HashType;
 
 
   /// Constructor/Desctructor
   /// Constructor/Desctructor
   explicit ctkAbstractFactory();
   explicit ctkAbstractFactory();
@@ -105,6 +106,9 @@ public:
   void setVerbose(bool value);
   void setVerbose(bool value);
   bool verbose()const;
   bool verbose()const;
 
 
+  void setRegisteredItems(const QSharedPointer<HashType>& items);
+  QSharedPointer<HashType> registeredItems();
+
 protected:
 protected:
 
 
   /// \brief Call the load method associated with the item.
   /// \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.
   /// Get a Factory item given its itemKey. Return 0 if any.
   ctkAbstractFactoryItem<BaseClassType> * item(const QString& itemKey)const;
   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:
 private:
   ctkAbstractFactory(const ctkAbstractFactory &); /// Not implemented
   ctkAbstractFactory(const ctkAbstractFactory &); /// Not implemented
   void operator=(const ctkAbstractFactory&); /// Not implemented
   void operator=(const ctkAbstractFactory&); /// Not implemented
 
 
-  QHash<QString, QSharedPointer<ctkAbstractFactoryItem<BaseClassType> > > RegisteredItemMap;
+  QSharedPointer<HashType> RegisteredItemMap;
 
 
   bool Verbose;
   bool Verbose;
 };
 };

+ 20 - 4
Libs/Core/ctkAbstractFactory.tpp

@@ -100,6 +100,7 @@ template<typename BaseClassType>
 ctkAbstractFactory<BaseClassType>::ctkAbstractFactory()
 ctkAbstractFactory<BaseClassType>::ctkAbstractFactory()
 {
 {
   this->Verbose = false;
   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,
   // Since by construction, we checked if a name was already in the QHash,
   // there is no need to call 'uniqueKeys'
   // 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
   // Store its reference using a QSharedPointer
-  this->RegisteredItemMap[key] = _item;
+  this->RegisteredItemMap->insert(key, _item);
   return true;
   return true;
 }
 }
 
 
@@ -185,8 +186,8 @@ bool ctkAbstractFactory<BaseClassType>::registerItem(const QString& key,
 template<typename BaseClassType>
 template<typename BaseClassType>
 ctkAbstractFactoryItem<BaseClassType> * ctkAbstractFactory<BaseClassType>::item(const QString& itemKey)const
 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;
     return 0;
     }
     }
@@ -207,4 +208,19 @@ bool ctkAbstractFactory<BaseClassType>::verbose()const
   return this->Verbose;
   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
 #endif