00001
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
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