00001 #ifndef mitkSet_H 00002 #define mitkSet_H 00003 00004 #include <itkDataObject.h> 00005 #include <itkCommand.h> 00006 #include <mitkCommon.h> 00007 #include <vector> 00008 #include <set> 00009 00010 #include "mitkSetObserver.h" 00011 00012 namespace mitk 00013 { 00014 00019 template <class T> 00020 class Set: public itk::DataObject 00021 { 00022 public: 00023 typedef mitk::SetObserver<T> Observer; 00024 mitkClassMacro(Set<T>, itk::Object); 00025 itkFactorylessNewMacro(Set<T>); 00026 00027 Set() 00028 { 00029 } 00030 00034 void Copy( mitk::Set<T>* otherSet ) 00035 { 00036 this->Clear(); 00037 for(unsigned int i=0; i< otherSet->GetSize(); ++i) 00038 { 00039 this->Add( otherSet->Get(i) ); 00040 } 00041 } 00042 00043 bool Add ( const T& obj ) 00044 { 00045 if(this->Has(obj)) // this is a set! do not add twice 00046 return false; 00047 00048 // add it now 00049 m_Objects.push_back(obj); // if index is not valid any more, just add 00050 // the element 00051 // subscribe for modified event 00052 typename itk::MemberCommand<mitk::Set<T> >::Pointer _modifiedCommand = 00053 itk::MemberCommand<mitk::Set<T> >::New(); 00054 _modifiedCommand->SetCallbackFunction(this 00055 , &Set<T>::OnObjectModified); 00056 m_ObjectModifiedTags[obj] = 00057 obj->AddObserver(itk::ModifiedEvent(), _modifiedCommand); 00058 00059 // subscribe for delete event 00060 typename itk::MemberCommand<mitk::Set<T> >::Pointer _DeleteCommand = 00061 itk::MemberCommand<mitk::Set<T> >::New(); 00062 _DeleteCommand->SetCallbackFunction(this 00063 , &Set<T>::OnObjectModified); 00064 m_ObjectDeleteTags[obj] = 00065 obj->AddObserver(itk::DeleteEvent(), _DeleteCommand); 00066 00067 for(typename std::set<SetObserver<T>*>::iterator it = m_SetObserver.begin(); 00068 it != m_SetObserver.end(); ++it) 00069 (*it)->OnAdded(obj); 00070 00071 this->Modified(); 00072 return true; 00073 } 00074 00075 bool Remove ( const T& obj ) 00076 { 00077 return this->Remove(this->IndexOf(obj)); 00078 } 00079 00080 bool Remove ( int index ) 00081 { 00082 if( !this->IsValid(index) ) // element must exist to be removed 00083 return false; 00084 00085 typename std::vector<T>::iterator it = m_Objects.begin(); 00086 std::advance(it, index); 00087 00088 T& obj = *it; 00089 00090 for(typename std::set<SetObserver<T>*>::iterator it2 00091 = m_SetObserver.begin(); it2 != m_SetObserver.end(); ++it2) 00092 (*it2)->OnRemove(*it); 00093 // remove it now 00094 obj->RemoveObserver(m_ObjectModifiedTags[obj]); 00095 obj->RemoveObserver(m_ObjectDeleteTags[obj]); 00096 m_ObjectModifiedTags.erase(obj); 00097 m_ObjectDeleteTags.erase(obj); 00098 m_Objects.erase(it); 00099 this->Modified(); 00100 return true; 00101 } 00102 00103 void Clear () 00104 { 00105 while(m_Objects.size() > 0) 00106 this->Remove(m_Objects.size()-1); 00107 } 00108 00109 unsigned int GetSize() const 00110 { 00111 return m_Objects.size(); 00112 } 00113 int IndexOf(const T& obj) const 00114 { 00115 int index = -1; 00116 typename std::vector<T>::const_iterator it = m_Objects.begin(); 00117 for(unsigned int i=0; i<m_Objects.size(); ++i) 00118 { 00119 if(m_Objects.at(i) == obj) 00120 { 00121 index = i; 00122 break; 00123 } 00124 } 00125 return index; 00126 } 00127 bool Has(const T& obj) const 00128 { 00129 return this->IndexOf(obj) != -1; 00130 } 00131 bool IsEmpty() const 00132 { 00133 return m_Objects.empty(); 00134 } 00135 bool IsValid( int index ) const 00136 { 00137 if(index >= 0) 00138 { 00139 return m_Objects.size() > 0 00140 && static_cast< unsigned int > (index) < m_Objects.size(); 00141 } 00142 return false; 00143 } 00144 T& Front() 00145 { 00146 return m_Objects.front(); 00147 } 00148 T& Back() 00149 { 00150 return m_Objects.back(); 00151 } 00152 T& Get( unsigned int index ) 00153 { 00154 return m_Objects.at(index); 00155 } 00156 const T& Front() const 00157 { 00158 return m_Objects.front(); 00159 } 00160 const T& Back() const 00161 { 00162 return m_Objects.back(); 00163 } 00164 const T& Get( unsigned int index ) const 00165 { 00166 return m_Objects.at(index); 00167 } 00168 void AddObserver( SetObserver<T>* observer ) const 00169 { 00170 m_SetObserver.insert( observer ); 00171 } 00172 void RemoveObserver( SetObserver<T>* observer ) const 00173 { 00174 m_SetObserver.erase( observer ); 00175 } 00176 void OnObjectModified(const itk::Object* caller 00177 , const itk::EventObject &event) 00178 { 00179 unsigned int i=0; 00180 for(; i<m_Objects.size(); ++i) 00181 if(m_Objects.at(i) == caller) 00182 break; 00183 00184 const itk::DeleteEvent* delEvent 00185 = dynamic_cast<const itk::DeleteEvent*>(&event); 00186 00187 // inform listeners 00188 for(typename std::set<SetObserver<T>*>::iterator it = m_SetObserver.begin(); 00189 it != m_SetObserver.end(); ++it) 00190 delEvent ? (*it)->OnDelete( this->Get(i) ) 00191 : (*it)->OnModified( this->Get(i) ); 00192 00193 // remove from list if object was deleted (no dangling pointers) 00194 if(delEvent) 00195 { 00196 this->Remove(i); 00197 } 00198 } 00199 00200 Set(const Set<T>& other) 00201 { 00202 *this = other; 00203 } 00204 Set<T>& operator= 00205 (const Set<T>& other) 00206 { 00207 // do not simply copy -> because of observer objects 00208 // instead: use add method for each element of the other List 00209 for(int i=0; i<other.GetSize(); ++i) 00210 this->Add( other.Get(i) ); 00211 00212 return *this; 00213 } 00214 virtual ~Set() 00215 { 00216 this->Clear(); 00217 } 00218 protected: 00222 std::vector<T> m_Objects; 00223 00227 mutable std::set<SetObserver<T>*> m_SetObserver; 00228 00232 std::map<const T, unsigned long> m_ObjectModifiedTags; 00233 00237 std::map<const T, unsigned long> m_ObjectDeleteTags; 00238 }; 00239 00240 } // namespace mitk 00241 00242 #endif // mitkSet_H