Added reflection memory cleanup

This commit is contained in:
Vulpovile
2023-11-04 00:28:41 -07:00
parent 26398f0586
commit c0aab09960
6 changed files with 34 additions and 4 deletions

View File

@@ -1,4 +1,6 @@
#pragma once #pragma once
#include "ErrorFunctions.h"
namespace B3D{ namespace B3D{
namespace Reflection{ namespace Reflection{
enum ReflectionType { enum ReflectionType {

View File

@@ -15,10 +15,12 @@ namespace B3D{
~ReflectionDataTable(void); ~ReflectionDataTable(void);
std::string ReflectionDataTable::getClassName(void); std::string ReflectionDataTable::getClassName(void);
void mapProperty(std::string key, ReflectionProperty<void*>* prop);
private: private:
//Perhaps not stored here? //Perhaps not stored here?
std::string className; std::string className;
std::map<std::string, B3D::Reflection::ReflectionProperty<void*>*> propertyTable; std::map<std::string, ReflectionProperty<void*>*> propertyTable;
Instance * parentInstance; Instance * parentInstance;
}; };
} }

View File

@@ -12,11 +12,14 @@ namespace B3D{
class ReflectionProperty class ReflectionProperty
{ {
public: public:
//Could be private?
std::string key;
T * value; T * value;
ReflectionType type; ReflectionType type;
ReflectionProperty(T * value, ReflectionType type, ReflectionDataTable * containerTable); ReflectionProperty(std::string key, T * value, ReflectionType type, ReflectionDataTable * containerTable);
ReflectionProperty(void); ReflectionProperty(void);
~ReflectionProperty(void); ~ReflectionProperty(void);
void dispose();
private: private:
std::string propertyName; std::string propertyName;
bool archivable; bool archivable;

View File

@@ -1,7 +1,7 @@
using namespace B3D::Reflection; using namespace B3D::Reflection;
template<class T> template<class T>
ReflectionProperty<T>::ReflectionProperty(T * value, ReflectionType type, ReflectionDataTable * containerTable) ReflectionProperty<T>::ReflectionProperty(std::string key, T * value, ReflectionType type, ReflectionDataTable * containerTable)
{ {
this->value = value; this->value = value;
this->type = type; this->type = type;
@@ -9,6 +9,7 @@ ReflectionProperty<T>::ReflectionProperty(T * value, ReflectionType type, Reflec
this->locked = locked; this->locked = locked;
this->archivable = archivable; this->archivable = archivable;
this->propertyHidden = propertyHidden; this->propertyHidden = propertyHidden;
containerTable->mapProperty(key, (ReflectionProperty<void*>*)this);
} }
template<class T> template<class T>
@@ -19,4 +20,11 @@ ReflectionProperty<T>::ReflectionProperty(void)
template<class T> template<class T>
ReflectionProperty<T>::~ReflectionProperty(void) ReflectionProperty<T>::~ReflectionProperty(void)
{ {
}
template<class T>
void ReflectionProperty<T>::dispose()
{
delete value;
value = NULL;
} }

View File

@@ -6,7 +6,8 @@ Instance::Instance(std::string className)
{ {
this->parent = NULL; this->parent = NULL;
this->dataTable = new Reflection::ReflectionDataTable(this, className); this->dataTable = new Reflection::ReflectionDataTable(this, className);
this->name = Reflection::ReflectionProperty<std::string>(new std::string("Default Game Instance"), Reflection::TYPE_STRING, dataTable); this->name = Reflection::ReflectionProperty<std::string>("Name", new std::string("Level"), Reflection::TYPE_STRING, dataTable);
Reflection::ReflectionProperty<std::string>("Name", new std::string("Level"), Reflection::TYPE_STRING, dataTable);
} }
Instance::Instance(void) Instance::Instance(void)

View File

@@ -14,9 +14,23 @@ ReflectionDataTable::ReflectionDataTable(void)
ReflectionDataTable::~ReflectionDataTable(void) ReflectionDataTable::~ReflectionDataTable(void)
{ {
std::map<std::string, ReflectionProperty<void*>*>::iterator it;
for (it = propertyTable.begin(); it != propertyTable.end(); it++)
{
it->second->dispose();
}
} }
std::string ReflectionDataTable::getClassName(void) std::string ReflectionDataTable::getClassName(void)
{ {
return className; return className;
}
void ReflectionDataTable::mapProperty(std::string key, ReflectionProperty<void*>* prop)
{
if(propertyTable.find(key) != propertyTable.end())
{
throw std::string("Reflection error: Key") + key + std::string("already defined!");
}
propertyTable[key] = prop;
} }