123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- #pragma once
- #include "CcosLock.h"
- #include "LinuxEvent.h"
- #include <map>
- //#include <algorithm>
- using namespace std;
- template<typename T,typename Q> class MsgMap
- {
- CcosLock m_Lock;
- std::shared_ptr<LinuxEvent> m_NotifyInMap;
- map<T,Q> m_DataMap;
- public:
- MsgMap(void)
- {
- m_NotifyInMap = LinuxEvent::CreateEvent(LinuxEvent::MANUAL_RESET,false);
- };
- ~MsgMap(void)
- {
- Clear();
- };
- bool Clear()
- {
- m_NotifyInMap->ResetEvent();
- m_Lock.Thread_Lock();
- m_DataMap.clear();
- m_Lock.Thread_UnLock();
- return true;
- };
- bool Find(T rKey, Q &rVal)
- {
- bool ret = false;
- m_Lock.Thread_Lock();
- //DebugPrint("before deQue size:%d\n",m_DataQueue.size());
- if (m_DataMap.size() > 0)
- {
-
- typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);// find(m_DataMap.begin(), m_DataMap.end(), rKey);
- if (result1 != m_DataMap.end())
- {
- rVal = m_DataMap[rKey];
- ret = true;
- }
- }
- //DebugPrint("after deQue size:%d\n",m_DataQueue.size());
- m_Lock.Thread_UnLock();
- return ret;
- };
- bool FindAndClear(T &rKey)
- {
- bool ret = false;
- typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);// find(m_DataMap.begin(), m_DataMap.end(), rKey);
- if (result1 != m_DataMap.end())
- {
- m_DataMap.erase(result1);
- ret = true;
- }
- if (m_DataMap.size() == 0)
- {
- m_NotifyInMap->ResetEvent();
- }
- return ret;
- };
- bool DeMap(T &rKey, Q &rVal)
- {
- bool ret = false;
- m_Lock.Thread_Lock();
- //DebugPrint("before deQue size:%d\n",m_DataQueue.size());
- if (m_DataMap.size() > 0)
- {
- typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);//find(m_DataMap.begin(), m_DataMap.end(), rKey);
- if (result1 != m_DataMap.end())
- {
- rVal = m_DataMap[rKey];
- m_DataMap.erase(result1);
- ret = true;
- }
- }
- //DebugPrint("after deQue size:%d\n",m_DataQueue.size());
- if (m_DataMap.size() == 0)
- {
- m_NotifyInMap->ResetEvent();
- }
- m_Lock.Thread_UnLock();
- return ret;
- };
- bool InMap(T &rKey,Q &rVal)
- {
- m_Lock.Thread_Lock();
- m_DataMap[rKey] = rVal;
- m_Lock.Thread_UnLock();
- m_NotifyInMap->SetEvent();
- return true;
- };
- DWORD WaitForInMap(DWORD timeout)
- {
- DWORD ret = WAIT_TIMEOUT;
- m_Lock.Thread_Lock();
- if (m_DataMap.size() > 0)
- {
- ret = WAIT_OBJECT_0;
- }
- m_Lock.Thread_UnLock();
- if(ret == WAIT_TIMEOUT)
- {
- return m_NotifyInMap->Wait(timeout);
- }
- return ret;
- };
- };
|