00001
00019 #ifndef ObjectManager_h
00020 #define ObjectManager_h
00021
00022 #include <rtm/RTC.h>
00023
00024 #include <vector>
00025 #include <string>
00026 #include <algorithm>
00027
00028 #include <ace/Thread.h>
00029 #include <ace/Synch.h>
00030
00050 template <typename Identifier, typename Object, typename Predicate>
00051 class ObjectManager
00052 {
00053 public:
00054 typedef std::vector<Object*> ObjectVector;
00055 typedef typename ObjectVector::iterator ObjectVectorItr;
00056 typedef typename ObjectVector::const_iterator ObjectVectorConstItr;
00057
00073 ObjectManager(){};
00074
00090 ~ObjectManager(){};
00091
00117 bool registerObject(Object* obj)
00118 {
00119 ObjectVectorItr it;
00120 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00121
00122 it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00123 Predicate(obj));
00124 if (it == m_objects._obj.end())
00125 {
00126 m_objects._obj.push_back(obj);
00127 return true;
00128 }
00129 return false;
00130 }
00131
00157 Object* unregisterObject(const Identifier& id)
00158 {
00159 ObjectVectorItr it;
00160 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00161
00162 it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00163 Predicate(id));
00164 if (it != m_objects._obj.end())
00165 {
00166 Object* obj(*it);
00167 m_objects._obj.erase(it);
00168 return obj;
00169 }
00170 return NULL;;
00171 }
00172
00201 Object* find(const Identifier& id) const
00202 {
00203 ObjectVectorConstItr it;
00204 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00205 it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00206 Predicate(id));
00207 if (it != m_objects._obj.end())
00208 {
00209 return *it;
00210 }
00211 return NULL;
00212 }
00213
00233 std::vector<Object*> getObjects() const
00234 {
00235 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00236 return m_objects._obj;
00237 }
00238
00246 template <class Pred>
00247 Pred for_each(Pred p)
00248 {
00249 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00250 return std::for_each(m_objects._obj.begin(), m_objects._obj.end(), p);
00251 }
00252
00260 template <class Pred>
00261 Pred for_each(Pred p) const
00262 {
00263 ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00264 return std::for_each(m_objects._obj.begin(), m_objects._obj.end(), p);
00265 }
00266
00267 protected:
00275 struct Objects
00276 {
00277 mutable ACE_Thread_Mutex _mutex;
00278 ObjectVector _obj;
00279 };
00287 Objects m_objects;
00288 };
00289 #endif // ObjectManager_h