ddnet/src/engine/shared/kernel.cpp

97 lines
2.3 KiB
C++
Raw Normal View History

2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
#include <base/system.h>
2010-05-29 07:25:38 +00:00
#include <engine/kernel.h>
#include <vector>
2010-05-29 07:25:38 +00:00
class CKernel : public IKernel
{
class CInterfaceInfo
{
public:
CInterfaceInfo() :
m_pInterface(nullptr),
m_AutoDestroy(false)
{
m_aName[0] = '\0';
}
CInterfaceInfo(const char *pName, IInterface *pInterface, bool AutoDestroy) :
m_pInterface(pInterface),
m_AutoDestroy(AutoDestroy)
2010-05-29 07:25:38 +00:00
{
str_copy(m_aName, pName);
2010-05-29 07:25:38 +00:00
}
2010-05-29 07:25:38 +00:00
char m_aName[64];
IInterface *m_pInterface;
bool m_AutoDestroy;
2010-05-29 07:25:38 +00:00
};
std::vector<CInterfaceInfo> m_vInterfaces;
2010-05-29 07:25:38 +00:00
CInterfaceInfo *FindInterfaceInfo(const char *pName)
{
for(CInterfaceInfo &Info : m_vInterfaces)
2010-05-29 07:25:38 +00:00
{
if(str_comp(pName, Info.m_aName) == 0)
return &Info;
2010-05-29 07:25:38 +00:00
}
return nullptr;
2010-05-29 07:25:38 +00:00
}
2010-05-29 07:25:38 +00:00
public:
CKernel() = default;
2010-05-29 07:25:38 +00:00
void Shutdown() override
{
for(int i = (int)m_vInterfaces.size() - 1; i >= 0; --i)
{
if(m_vInterfaces[i].m_AutoDestroy)
{
m_vInterfaces[i].m_pInterface->Shutdown();
}
}
}
~CKernel() override
{
// delete interfaces in reverse order just the way it would happen to objects on the stack
for(int i = (int)m_vInterfaces.size() - 1; i >= 0; --i)
{
if(m_vInterfaces[i].m_AutoDestroy)
{
delete m_vInterfaces[i].m_pInterface;
m_vInterfaces[i].m_pInterface = nullptr;
}
}
}
void RegisterInterfaceImpl(const char *pName, IInterface *pInterface, bool Destroy) override
2010-05-29 07:25:38 +00:00
{
dbg_assert(str_length(pName) < (int)sizeof(CInterfaceInfo().m_aName), "Interface name too long");
dbg_assert(FindInterfaceInfo(pName) == nullptr, "Duplicate interface name");
2010-05-29 07:25:38 +00:00
pInterface->m_pKernel = this;
m_vInterfaces.emplace_back(pName, pInterface, Destroy);
2010-05-29 07:25:38 +00:00
}
void ReregisterInterfaceImpl(const char *pName, IInterface *pInterface) override
2010-05-29 07:25:38 +00:00
{
dbg_assert(FindInterfaceInfo(pName) != nullptr, "Cannot reregister interface that is not registered");
2010-05-29 07:25:38 +00:00
pInterface->m_pKernel = this;
}
IInterface *RequestInterfaceImpl(const char *pName) override
2010-05-29 07:25:38 +00:00
{
CInterfaceInfo *pInfo = FindInterfaceInfo(pName);
dbg_assert(pInfo != nullptr, "Interface not found");
2010-05-29 07:25:38 +00:00
return pInfo->m_pInterface;
}
};
IKernel *IKernel::Create() { return new CKernel; }