Files
2022-10-26 12:25:11 +08:00

109 lines
2.4 KiB
C++

#pragma once
#include "WorkLoad.Common.h"
#include "WorkLoadManager.h"
// 쌍방을 검색하고 관리하기 쉬운 방법을 생각해 볼 것.
template<typename _TYPE >
class WorkLoadContainer
{
typedef std::pair<WORK_KEY, _TYPE> _INTER_VALUE_PAIR;
typedef std::pair<_TYPE, _INTER_VALUE_PAIR> _INTER_PAIR;
typedef STLX_MAP<_TYPE, _INTER_VALUE_PAIR> _INTER_MAP;
public:
WorkLoadContainer() { Initialize(); }
~WorkLoadContainer() { Release( TRUE ); }
public:
VOID Initialize() { Release(); }
VOID Release( BOOL bRelatedObjectRelease = FALSE )
{
if( bRelatedObjectRelease )
{
while( m_WorkMap.size() )
{
_INTER_MAP::iterator it = m_WorkMap.begin();
_TYPE key = it->first;
ReleaseWork( key, TRUE );
}
}
m_WorkMap.clear();
}
BOOL RegisterWork( WORK_KEY value_workKey, _TYPE key )
{
_INTER_MAP::iterator it = m_WorkMap.find( key );
if( it != m_WorkMap.end() )
{
ASSERT( !"중복된 Work을 등록하려고 했다." );
return FALSE;
}
m_WorkMap.insert( m_WorkMap.end(), _INTER_PAIR( key, _INTER_VALUE_PAIR(value_workKey, key) ) );
return TRUE;
}
WORK_KEY FindWorkKey( _TYPE key )
{
_INTER_MAP::iterator it = m_WorkMap.find( key );
if( it == m_WorkMap.end() )
return WorkLoadManager::c_NotExistKey;
return it->second.first;
}
_TYPE FindWorkKeyPair( WORK_KEY value_workKey )
{
_INTER_MAP::iterator it(m_WorkMap.begin()), end(m_WorkMap.end());
for( ; it != end ; ++it )
{
if( it->second.first == value_workKey )
return it->second.second;
}
return NULL;
}
VOID ReleaseWork( _TYPE key, BOOL bRelatedObjectRelease = FALSE )
{
_INTER_MAP::iterator it = m_WorkMap.find( key );
if( it == m_WorkMap.end() )
return;
if( bRelatedObjectRelease )
{
_INTER_VALUE_PAIR& rPair = it->second;
WORK_KEY workKey = rPair.first;
WorkLoadManager::ReleaseTask( workKey, TRUE );
}
it = m_WorkMap.find( key );
if( it == m_WorkMap.end() )
return;
m_WorkMap.erase( it );
}
VOID OnMsg( sSIG_MSG* pSIG_MSG )
{
_INTER_MAP::iterator it = m_WorkMap.begin();
_INTER_MAP::iterator itend = m_WorkMap.end();
for( ; it != itend ; ++it )
{
_TYPE key = it->first;
IWorkNode* pWorkNode = (IWorkNode*)(__int64)key;
pWorkNode->OnMsg( pSIG_MSG );
}
}
private:
private:
//pair<WORK_KEY, _T>
// _T가 포인터일 경우, 이것은 참조라고만 생각하며, 해제하지 않는다. 주의할 것
_INTER_MAP m_WorkMap;
};
typedef WorkLoadContainer<DWORD> WORK_LOAD_CONTAINER_SESSION_WORK;