Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 39 additions & 9 deletions ObjectSerializer/Include/ObjectFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,60 @@

#include <string>
#include <map>
#include <memory>
using namespace std;
using namespace Serialization;

typedef map<string, UserObject*> ObjectTable;
typedef std::map<std::string, Serialization::UserObject*> ObjectTable;

namespace Serialization
{
typedef Serialization::UserObject* (*PfnUserObjectFactory)();
typedef std::map<std::string, PfnUserObjectFactory> ObjectFactoryMap;

template<class T>
UserObject* UserObjectFactory() { return new T; }

class ObjectFactory
{
map<string, string> m_cNameToFullNameTable;
ObjectTable m_prototypes;
ObjectFactoryMap m_factories;

public:
UserObject* GetObject(const string& p_typeName);
const string& FromCName(const string& p_cName);
UserObject* AddPrototype(UserObject* p_prototype);
UserObject* AddPrototype(UserObject* p_prototype, char* p_fullName);
ObjectTable& GetObjectTable() { return m_prototypes; }
UserObject* GetObject(const string& p_typeName);
const string& FromCName(const string& p_cName);
UserObject* Create(const string& p_typeName);

template<class T>
PfnUserObjectFactory AddPrototype(const char* pNameOverride = nullptr)
{
std::shared_ptr<T> pPrototype(new T);
_ASSERTE(pPrototype != NULL);
string cname = pPrototype->CName();

if (nullptr != pNameOverride)
{
m_cNameToFullNameTable[cname] = pNameOverride;
m_factories[pNameOverride] = &UserObjectFactory<T>;
}
else
{
string tname = pPrototype->TypeName();
m_cNameToFullNameTable[cname] = tname;
m_factories[tname] = &UserObjectFactory<T>;
}

return UserObjectFactory<T>;
}

ObjectFactoryMap& GetObjectTable() { return m_factories; }
static ObjectFactory& Instance() { static ObjectFactory instance; return instance; }
};

#define g_ObjectFactory ObjectFactory::Instance()
#define DECL_SERIALIZABLE(C) \
static Serialization::UserObject* g_p##C##PrototypeFactory_Internal = g_ObjectFactory.AddPrototype(new C);

static PfnUserObjectFactory __pfn##C##Factory_Internal = g_ObjectFactory.AddPrototype<C>();
#define DECL_SERIALIZABLE_NAMED(C, NAME) \
static PfnUserObjectFactory __pfn##C##Factory_Internal = g_ObjectFactory.AddPrototype<C>(NAME);
}
#endif // OBJECTFACTORY_H_H
4 changes: 2 additions & 2 deletions ObjectSerializer/Include/ObjectFormatter.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ class ObjectFormatter
void GetParentNode(Attributes& p_attributes, TypeTable& p_typeTable, TypeNode*& p_lastTypeRoot);
void GetAliasNode(Attributes& p_attributes, TypeTable& p_typeTable, TypeNode*& p_lastTypeRoot);
bool IsFormatLine(string& p_line, string& p_format);
void CollectTemplateSpecialization(TypeTable& p_typeTable, ObjectTable& p_objectTable);
void CollectTemplateSpecialization(TypeTable& p_typeTable, Serialization::ObjectFactoryMap& p_objectTable);

public:
~ObjectFormatter();
ObjectFormatter();

void WriteTypeTable(const string& p_sourceCodeDir);
void FinalizeTypeTable(TypeTable& p_typeTable, ObjectTable& p_objectTable);
void FinalizeTypeTable(TypeTable& p_typeTable, Serialization::ObjectFactoryMap& p_objectTable);
void ReadTypeTable(TypeTable& p_typeTable);
static ObjectFormatter& Instance() { static ObjectFormatter instance; return instance; }

Expand Down
32 changes: 6 additions & 26 deletions ObjectSerializer/Source/ObjectFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,27 @@
#include <stdio.h>

//----------------------------------------------------------------------------------------------
UserObject* ObjectFactory::AddPrototype(UserObject* p_prototype)
{
_ASSERTE(p_prototype != NULL);
string cname = p_prototype->CName();
string tname = p_prototype->TypeName();
m_cNameToFullNameTable[cname] = tname;
m_prototypes[p_prototype->TypeName()] = p_prototype;

return p_prototype;
}
//----------------------------------------------------------------------------------------------
UserObject* ObjectFactory::AddPrototype(UserObject* p_prototype, char* p_fullName)
{
_ASSERTE(p_prototype != NULL);
m_cNameToFullNameTable[p_prototype->CName()] = p_fullName;
m_prototypes[p_fullName] = p_prototype;

return p_prototype;
}
//----------------------------------------------------------------------------------------------
UserObject* ObjectFactory::GetObject(const string& p_typeName)
UserObject* ObjectFactory::Create(const string& p_typeName)
{
_ASSERTE(!p_typeName.empty());
ObjectTable::iterator where;
ObjectFactoryMap::iterator where;
if(m_cNameToFullNameTable.find(p_typeName) != m_cNameToFullNameTable.end())
{
where = m_prototypes.find(m_cNameToFullNameTable[p_typeName]);
where = m_factories.find(m_cNameToFullNameTable[p_typeName]);
}
else
{
where = m_prototypes.find(p_typeName);
where = m_factories.find(p_typeName);
}

if (where == m_prototypes.end())
if (where == m_factories.end())
{
char buffer[256];
sprintf_s(buffer, sizeof(buffer), "Failed to retrieve object '%s'", p_typeName.c_str());
throw std::exception(buffer);
}

return where->second;
return where->second();
}
//----------------------------------------------------------------------------------------------
const string& ObjectFactory::FromCName(const string& p_cName)
Expand Down
16 changes: 9 additions & 7 deletions ObjectSerializer/Source/ObjectFormatter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
#endif

#ifndef TYPERESOLVER_H
#include "TypeResolver.h"
#include "TypeResolver.h"
#endif
#include <memory>

string g_TypeInfoPath;
string g_TypeLexerFilePath;
Expand Down Expand Up @@ -254,7 +255,7 @@ void ObjectFormatter::GetNewTypeNode(Attributes& p_attributes, TypeTable& p_typ
/*vector<string> parents;
if(p_attributes.find(HATTR_Parent) != p_attributes.end())
{
Split(p_attributes[HATTR_Parent], ',', parents);
Split(p_attributes[HATTR_Parent], ',', parents);
}
*/

Expand Down Expand Up @@ -361,27 +362,28 @@ void ObjectFormatter::ReadTypeNames()
eye.close();
}
//----------------------------------------------------------------------------------------------
void ObjectFormatter::FinalizeTypeTable(TypeTable& p_typeTable, ObjectTable& p_objectTable)
void ObjectFormatter::FinalizeTypeTable(TypeTable& p_typeTable, ObjectFactoryMap& p_objectTable)
{
// 1. Collect template type specialization
CollectTemplateSpecialization(p_typeTable, p_objectTable);
}
//----------------------------------------------------------------------------------------------
void ObjectFormatter::CollectTemplateSpecialization(TypeTable& p_typeTable, ObjectTable& p_objectTable)
void ObjectFormatter::CollectTemplateSpecialization(TypeTable& p_typeTable, ObjectFactoryMap& p_objectTable)
{
for(ObjectTable::iterator objItr = p_objectTable.begin();
for(ObjectFactoryMap::iterator objItr = p_objectTable.begin();
objItr != p_objectTable.end();
++objItr)
{
string typeName = objItr->second->TypeName();
shared_ptr<UserObject> pObj(objItr->second());
string typeName = pObj->TypeName();
if(p_typeTable.find(typeName) != p_typeTable.end())
{
TypeData& typeTemplate = p_typeTable[typeName];
// type has template arguments and is for sure it is specialized
if(!typeTemplate.TypeGraph->TemplateArguments.empty())
{
// 1. extract object specialization info
string specializedTypeName = g_ObjectFactory.FromCName(objItr->second->CName());
string specializedTypeName = g_ObjectFactory.FromCName(pObj->CName());
_ASSERTE(p_typeTable.find(specializedTypeName) == p_typeTable.end());

// 2. parse specialization string and get specialized type graph
Expand Down
2 changes: 1 addition & 1 deletion ObjectSerializer/Source/ObjectSerializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ int ObjectSerializer::DeserializeUserDefinedType(char* p_fieldAddress, TypeNode*

p_eye.read(buffer, MaxTypeNameLength + 1);
typeName = buffer;
object = static_cast<UserObject*>(g_ObjectFactory.GetObject(typeName)->Prototype());
object = static_cast<UserObject*>(g_ObjectFactory.Create(typeName));

PerformLateBinding(object, p_type);

Expand Down