メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ

ObjectManager.h

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

OpenRTMに対してFri Oct 5 05:14:57 2007に生成されました。  doxygen 1.4.1