ObjectManager.h

Go to the documentation of this file.
00001 // -*- C++ -*-
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

Generated on Wed May 21 05:17:34 2008 for OpenRTM by  doxygen 1.5.3