// NeL - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdmisc.h"
#include "nel/misc/class_registry.h"
using namespace std;
namespace NLMISC
{
// ======================================================================================================
CClassRegistry::TClassMap *CClassRegistry::RegistredClasses = NULL;
// ======================================================================================================
void CClassRegistry::init()
{
if (RegistredClasses == NULL)
RegistredClasses = new TClassMap;
}
// ======================================================================================================
void CClassRegistry::release()
{
if( RegistredClasses )
delete RegistredClasses;
RegistredClasses = NULL;
}
// ======================================================================================================
IClassable *CClassRegistry::create(const string &className) throw(ERegistry)
{
init();
TClassMap::iterator it;
it=RegistredClasses->find(className);
if(it==RegistredClasses->end())
return NULL;
else
{
IClassable *ptr;
ptr=it->second.Creator();
#ifdef NL_DEBUG
nlassert(CClassRegistry::checkObject(ptr));
#endif
return ptr;
}
}
// ======================================================================================================
void CClassRegistry::registerClass(const string &className, IClassable* (*creator)(), const string &typeidCheck) throw(ERegistry)
{
init();
CClassNode node;
node.Creator=creator;
node.TypeIdCheck= typeidCheck;
std::pair result;
result = RegistredClasses->insert(TClassMap::value_type(className, node));
if(!result.second)
{
nlstop;
throw ERegisteredClass();
}
}
// ======================================================================================================
bool CClassRegistry::checkObject(IClassable* obj)
{
init();
TClassMap::iterator it;
it=RegistredClasses->find(obj->getClassName());
if(it==RegistredClasses->end())
return false;
if( it->second.TypeIdCheck != string(typeid(*obj).name()) )
return false;
return true;
}
}