1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
/*
* CTypeList.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
VCMI_LIB_NAMESPACE_BEGIN
/// Class that implements basic reflection-like mechanisms
/// For every type registered via registerType() generates inheritance tree
/// Rarely used directly - usually used as part of CApplier
class CTypeList
{
std::map<std::string, uint16_t> typeInfos;
DLL_LINKAGE CTypeList();
template <typename T>
const std::type_info & getTypeInfo(const T * t = nullptr) const
{
if(t)
return typeid(*t);
else
return typeid(T);
}
public:
static CTypeList & getInstance()
{
static CTypeList registry;
return registry;
}
template<typename T>
void registerType(uint16_t index)
{
const std::type_info & typeInfo = typeid(T);
if (typeInfos.count(typeInfo.name()) != 0)
return;
typeInfos[typeInfo.name()] = index;
}
template<typename T>
uint16_t getTypeID(T * typePtr)
{
static_assert(!std::is_pointer_v<T>, "CTypeList does not supports pointers!");
static_assert(!std::is_reference_v<T>, "CTypeList does not supports references!");
const std::type_info & typeInfo = getTypeInfo(typePtr);
if (typeInfos.count(typeInfo.name()) == 0)
return 0;
return typeInfos.at(typeInfo.name());
}
};
VCMI_LIB_NAMESPACE_END
|