Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

ObjectManager.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00019 /*
00020  * $Log: ObjectManager.h,v $
00021  * Revision 1.6  2007/04/27 03:27:25  n-ando
00022  * A trivial fix.
00023  *
00024  * Revision 1.5  2007/04/26 15:30:32  n-ando
00025  * The header include order was modified to define _REENTRANT before
00026  * including ace/config-lite.h in Linux systems.
00027  * In ace 5.4.7 or later, _REENTRANT flag should be defined explicitly.
00028  *
00029  * Revision 1.4  2007/04/13 18:11:26  n-ando
00030  * Now return values are used for error propagation instead of exception.
00031  *
00032  * Revision 1.3  2006/11/06 01:42:22  n-ando
00033  * ObjectManager's for_each has been modified to return Predicate object.
00034  *
00035  * Revision 1.2  2006/10/25 17:31:03  n-ando
00036  * for_each()'s arguments are changed from value to reference.
00037  *
00038  * Revision 1.1  2006/10/17 10:21:50  n-ando
00039  * The first commitment.
00040  *
00041  *
00042  */
00043 
00044 #ifndef ObjectManager_h
00045 #define ObjectManager_h
00046 
00047 #include <rtm/RTC.h>
00048 
00049 #include <vector>
00050 #include <string>
00051 #include <algorithm>
00052 
00053 #include <ace/Thread.h>
00054 #include <ace/Synch.h>
00055 
00056 template <typename Identifier, typename Object, typename Predicate>
00057 class ObjectManager
00058 {
00059  public:
00060   typedef std::vector<Object*>                  ObjectVector;
00061   typedef typename ObjectVector::iterator       ObjectVectorItr;
00062   typedef typename ObjectVector::const_iterator ObjectVectorConstItr;
00063 
00064 
00065   ObjectManager(){};
00066 
00067 
00068   ~ObjectManager(){};
00069 
00070 
00071   bool registerObject(Object* obj)
00072   {
00073     ObjectVectorItr it;
00074     ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00075 
00076     it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00077                       Predicate(obj));
00078     if (it == m_objects._obj.end())
00079       {
00080         m_objects._obj.push_back(obj);
00081         return true;
00082       }
00083     return false;
00084   }
00085 
00086 
00087   Object* unregisterObject(const Identifier& id)
00088   {
00089     ObjectVectorItr it;
00090     ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00091 
00092     it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00093                       Predicate(id));
00094     if (it != m_objects._obj.end())
00095       {
00096         Object* obj(*it);
00097         m_objects._obj.erase(it);
00098         return obj;
00099       }
00100     return NULL;;
00101   }
00102 
00103 
00104   Object* find(const Identifier& id) const
00105   {
00106     ObjectVectorConstItr it;
00107     ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00108     it = std::find_if(m_objects._obj.begin(), m_objects._obj.end(),
00109                       Predicate(id));
00110     if (it != m_objects._obj.end())
00111       {
00112         return *it;
00113       }
00114     return NULL;
00115   }
00116 
00117 
00118   std::vector<Object*> getObjects() const
00119   {
00120     ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00121     return m_objects._obj;
00122   }
00123 
00124 
00125   template <class Pred>
00126   Pred for_each(Pred p)
00127   {
00128     ACE_Guard<ACE_Thread_Mutex> guard(m_objects._mutex);
00129     return std::for_each(m_objects._obj.begin(), m_objects._obj.end(), p);
00130   }
00131 
00132  protected:
00133   struct Objects
00134   {
00135     mutable ACE_Thread_Mutex _mutex;
00136     ObjectVector _obj;
00137   };
00138   Objects m_objects;
00139 };
00140 
00141 #endif // ObjectManager_h

Generated on Mon Jul 23 17:08:14 2007 for OpenRTM by  doxygen 1.4.1