Nebula
Loading...
Searching...
No Matches
componentserialization.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
13//------------------------------------------------------------------------------
14#include "io/memorystream.h"
15#include "io/binarywriter.h"
16#include "io/binaryreader.h"
17#include "io/jsonreader.h"
18#include "io/jsonwriter.h"
19#include "util/stringatom.h"
20#include "util/dictionary.h"
21#include "util/delegate.h"
22#include "game/componentid.h"
23#include <functional>
24
25namespace Game
26{
27
28//------------------------------------------------------------------------------
32{
33public:
34 using DeserializeJsonFunc = std::function<void(Ptr<IO::JsonReader> const&, const char* name, void*)>;
35 using SerializeJsonFunc = std::function<void(Ptr<IO::JsonWriter> const&, const char* name, void*)>;
36
38 {
40 RESOURCE, // TODO: resources should be a special type, not a stringatom. Should be a wrapper around a string atom instead.
42 };
43
45 static void Destroy();
46
47 template<typename TYPE>
48 static void Register(ComponentId component);
49
51 static void Deserialize(Ptr<IO::JsonReader> const& reader, ComponentId component, void* ptr);
53 static void Serialize(Ptr<IO::JsonWriter> const& writer, ComponentId component, void* ptr);
54
56 static void Override(ComponentId component, DeserializeJsonFunc deserialize, SerializeJsonFunc serialize);
57
59 static void OverrideType(OverridableType type, DeserializeJsonFunc deserialize, SerializeJsonFunc serialize);
60
65
66private:
69
71
73 bool ValidateTypeSize(ComponentId component, uint32_t size);
74
80
82
84};
85
86//------------------------------------------------------------------------------
89template<typename TYPE>
90inline void
92{
93 // Setup a type-specific read function
94 const auto read = [](Ptr<IO::JsonReader> const& reader, const char* name, void* ptr)
95 {
96 TYPE& value = *(static_cast<TYPE*>(ptr));
97 reader->Get(value, name);
98 };
99
100 // Setup a type-specific write function
101 const auto write = [](Ptr<IO::JsonWriter> const& writer, const char* name, void* ptr)
102 {
103 TYPE& value = *(static_cast<TYPE*>(ptr));
104 writer->Add(value, name);
105 };
106
107 // TODO: Serialization
108
109 auto* reg = Instance();
110 if (!reg->ValidateTypeSize(component, sizeof(TYPE)))
111 {
112 n_error("Trying to add a serializer that works on different sized component compared to what is registered in the MemDb::AttributeRegistry!");
113 return;
114 }
115
116 Serializer s;
117 s.deserializeJson = read;
118 s.serializeJson = write;
119 while (reg->serializers.Size() <= component.id)
120 {
121 reg->serializers.Grow();
122 reg->serializers.Resize(reg->serializers.Capacity());
123 }
124
125 reg->serializers[component.id] = s;
126}
127
128} // namespace Game
Component serialization functions.
Definition componentserialization.h:32
std::function< void(Ptr< IO::JsonReader > const &, const char *name, void *)> DeserializeJsonFunc
Definition componentserialization.h:34
std::function< void(Ptr< IO::JsonWriter > const &, const char *name, void *)> SerializeJsonFunc
Definition componentserialization.h:35
OverridableType
Definition componentserialization.h:38
@ RESOURCE
Definition componentserialization.h:40
@ NUM_OVERRIDABLE_TYPES
Definition componentserialization.h:41
@ ENTITY
Definition componentserialization.h:39
static void Destroy()
This static method is used to destroy the registry object and should be called right before the main ...
Definition componentserialization.cc:39
static DeserializeJsonFunc & GetTypeDeserializeFunc(OverridableType type)
Get the deserialize override for a specific type.
Definition componentserialization.cc:95
ComponentSerialization()
Definition componentserialization.cc:114
static void Serialize(Ptr< IO::JsonWriter > const &writer, ComponentId component, void *ptr)
ptr points to the value that should be stored
Definition componentserialization.cc:63
static void OverrideType(OverridableType type, DeserializeJsonFunc deserialize, SerializeJsonFunc serialize)
override a specific type serializer. This will be called instead of a standard variant.
Definition componentserialization.cc:84
Serializer typeOverrides[NUM_OVERRIDABLE_TYPES]
Definition componentserialization.h:83
static SerializeJsonFunc & GetTypeSerializeFunc(OverridableType type)
Get the serialize override for a specific type.
Definition componentserialization.cc:105
static void Deserialize(Ptr< IO::JsonReader > const &reader, ComponentId component, void *ptr)
ptr points to the location where the value should be stored. Make sure you have room for it!
Definition componentserialization.cc:52
~ComponentSerialization()
Definition componentserialization.cc:122
static void Override(ComponentId component, DeserializeJsonFunc deserialize, SerializeJsonFunc serialize)
override a specific components serialization and deserialization funcs
Definition componentserialization.cc:74
Util::Array< Serializer > serializers
Definition componentserialization.h:81
static void Register(ComponentId component)
Definition componentserialization.h:91
static ComponentSerialization * Instance()
The registry's constructor is called by the Instance() method, and nobody else.
Definition componentserialization.cc:22
static ComponentSerialization * Singleton
Definition componentserialization.h:70
bool ValidateTypeSize(ComponentId component, uint32_t size)
validate that the size of MemDb::AttributeRegistry's component named 'name' has typesize of 'size'
Definition componentserialization.cc:131
Nebula's smart pointer class which manages the life time of RefCounted objects.
Definition ptr.h:38
Nebula's dynamic array class.
Definition array.h:60
void __cdecl n_error(const char *msg,...)
This function is called when a serious situation is encountered which requires abortion of the applic...
Definition debug.cc:138
Game::EditorState.
Definition graphicsmanager.h:64
MemDb::AttributeId ComponentId
Definition componentid.h:15
Definition componentserialization.h:76
DeserializeJsonFunc deserializeJson
Definition componentserialization.h:77
SerializeJsonFunc serializeJson
Definition componentserialization.h:78