Код:
#pragma once
#include "CommonLogic/ServerTabfileLoader.h"
#include "System/Collections/KMapByVector.h"
#include "CommonLogic/GlobalFunction.h"
template <class TManager, class TKeyType1, class TKeyType2, class TConfig, int NGroupNum=128, int NListNum=128>
class CCfg2KeyMgrTemplate : public KSingleton<TManager>
{
public:
static const int STEP_DIV = 4;
typedef KMapByVector<TKeyType2, TConfig*> TDataList;
typedef struct SDataListNode : public System::Memory::KPortableStepPool<SDataListNode, NGroupNum>
{
SDataListNode() : DataList(NListNum, NListNum/STEP_DIV) {}
TDataList DataList;
};
typedef KMapByVector<TKeyType1,SDataListNode*> TDataMap;
public:
CCfg2KeyMgrTemplate() : m_DataMap(NGroupNum, NGroupNum/STEP_DIV) {}
~CCfg2KeyMgrTemplate() { this->Clear(); }
public:
BOOL LoadTable(const char* pFilePath);
const TDataList* GetGroup(const TKeyType1& keyValue) const
{
typename TDataMap::const_iterator iter = m_DataMap.find(keyValue);
if (iter != m_DataMap.end())
{
return &(iter->second->DataList);
}
return NULL;
}
const TConfig* GetConfig(const TKeyType1& key1, const TKeyType2 key2) const
{
const TDataList* pList = GetGroup(key1);
if (pList)
{
typename TDataList::const_iterator iter = pList->find(key2);
if (iter != pList->end())
{
return iter->second;
}
}
return NULL;
}
const TDataMap* GetAllData() const { return &m_DataMap; }
BOOL HasGroup(const TKeyType1& keyValue) const
{
return m_DataMap.find(keyValue) != m_DataMap.end();
}
BOOL Has(const TKeyType1& key1, const TKeyType2& key2)
{
return GetConfig(key1, key2) != NULL;
}
protected:
void Clear()
{
for (typename TDataMap::iterator iter = m_DataMap.begin(); iter != m_DataMap.end(); ++iter)
{
for (int i = 0; i < iter->second->DataList.size(); ++i)
{
TConfig::Free(iter->second->DataList[i]);
}
SDataListNode::Free(iter->second);
}
m_DataMap.clear();
}
protected:
TDataMap m_DataMap;
};
template <class TManager, class TKeyType1, class TKeyType2, class TConfig, int NGroupNum, int NListNum>
BOOL CCfg2KeyMgrTemplate<TManager, TKeyType1, TKeyType2, TConfig, NGroupNum, NListNum>::LoadTable(const char* pFilePath)
{
ASSERT_RETURN(pFilePath, FALSE);
CServerTabfileLoader& loader = CServerTabfileLoader::GetInstance();
KTabFile2* pTabFile = loader.GetFileReader(pFilePath);
if (NULL == pTabFile)
{
AssertFile(pFilePath);
Log(LOG_ERROR, "[ERROR] LoadTable from %s failed", pFilePath);
return FALSE;
}
this->Clear();
INT nRet = 0;
TConfig* pConfig = NULL;
typename TDataMap::iterator iter;
TKeyType1 key1;
TKeyType2 key2;
for (INT nLine = 2; nRet = pTabFile->ReadLine(); ++nLine)
{
if (nRet == -1)
{
loader.CloseFileReader(pTabFile);
AssertFile(pFilePath);
return FALSE;
}
pConfig = TConfig::Alloc();
if (pConfig->ReadItem(*pTabFile))
{
key1 = pConfig->GetKey1();
key2 = pConfig->GetKey2();
if (GetConfig(key1, key2) == NULL)
{
if (GetGroup(key1) == NULL)
{
iter = m_DataMap.insert_unique(key1, SDataListNode::Alloc());
}
iter->second->DataList.insert_unique(key2, pConfig);
continue;
}
else
{
Log(LOG_ERROR, "[ERROR] LoadTable from %s failed, line:%d, multi key, key1:%d, key2:%d", pFilePath, nLine, key1, key2);
}
}
TConfig::Free(pConfig);
this->Clear();
Log(LOG_ERROR, "[ERROR] LoadTable from %s failed, line:%d", pFilePath, nLine);
return FALSE;
}
loader.CloseFileReader(pTabFile);
return TRUE;
}
(18): warning C4091: typedef : пропускается слева от "CCfg2KeyMgrTemplate<XCfgBuffLevelM gr,DWORD,BYTE,XCfgBuffLevel,64,64>: :SDataListNode", когда ни одна переменная не объявлена
(80): note: выполняется компиляция ссылки на экземпляр шаблон класс "CCfg2KeyMgrTemplate<TManager,TKeyT ype1,TKeyType2,TConfig,NGroupNum,NL istNum>"
help