Create Deserialize function to eventually replace Deserialise class

This commit is contained in:
GregF
2016-02-07 18:43:23 +01:00
committed by baldurk
parent 7cab194395
commit c3553d26a9
4 changed files with 23 additions and 8 deletions
+6 -6
View File
@@ -2221,15 +2221,15 @@ void Serialiser::Serialise(const char *name, VkDeviceCreateInfo &el)
//template <> class Serialiser::Deserialise<VkDeviceCreateInfo>;
template<>
Serialiser::Deserialise<VkDeviceCreateInfo>::~Deserialise()
void Serialiser::Deserialize(const VkDeviceCreateInfo* const el) const
{
if(m_Mode == READING)
{
RDCASSERT(pNext == NULL); // otherwise delete
delete [] pRequestedQueues;
delete ppEnabledExtensionNames;
delete ppEnabledLayerNames;
delete pEnabledFeatures;
RDCASSERT(el->pNext == NULL); // otherwise delete
delete [] el->pRequestedQueues;
delete el->ppEnabledExtensionNames;
delete el->ppEnabledLayerNames;
delete el->pEnabledFeatures;
}
}
+2
View File
@@ -137,6 +137,8 @@ template<> void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR
// template<> class Serialiser::Deserialise : VkDeviceCreateInfo;
//template<> void Serialiser::Deserialize(const VkDeviceCreateInfo* const el) const;
#pragma region Chunks
enum VulkanChunkType
@@ -200,7 +200,7 @@ bool WrappedVulkan::Serialise_vkCreateDevice(
VkDevice* pDevice)
{
SERIALISE_ELEMENT(ResourceId, physId, GetResID(physicalDevice));
SERIALISE_ELEMENT_CLASS(VkDeviceCreateInfo, createInfo, *pCreateInfo);
SERIALISE_ELEMENT(VkDeviceCreateInfo, createInfo, *pCreateInfo);
SERIALISE_ELEMENT(ResourceId, devId, GetResID(*pDevice));
if(m_State == READING)
+14 -1
View File
@@ -444,6 +444,9 @@ class Serialiser
Mode m_Mode;
};
// function to deallocate members
template<class T> void Deserialize(const T* const el) const {}
template<typename X>
void Serialise(const char *name, std::vector<X> &el)
{
@@ -768,6 +771,16 @@ class ScopedContext
}
};
template<class T>
struct ScopedDeserialise
{
ScopedDeserialise(const Serialiser* const ser, const T* const t) : m_ser(ser), m_t(t) {}
~ScopedDeserialise() { m_ser->Deserialize(m_t); }
const Serialiser* const m_ser;
const T* const m_t;
};
// can be overridden to locally cache the serialiser pointer (e.g. for TLS lookup)
#define GET_SERIALISER GetSerialiser()
@@ -775,7 +788,7 @@ class ScopedContext
#define SCOPED_SERIALISE_CONTEXT(n) ScopedContext scope(GET_SERIALISER, GetChunkName(n), n, false);
#define SCOPED_SERIALISE_SMALL_CONTEXT(n) ScopedContext scope(GET_SERIALISER, GetChunkName(n), n, true);
#define SERIALISE_ELEMENT(type, name, inValue) type name; if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name);
#define SERIALISE_ELEMENT(type, name, inValue) type name; ScopedDeserialise<type> CONCAT(deserialise_, name)(m_pSerialiser, &name); if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name);
#define SERIALISE_ELEMENT_CLASS(type, name, inValue) Serialiser::Deserialise<type> name; if(m_State >= WRITING) { static_cast<type&>(name) = (inValue); name.m_Mode = Serialiser::WRITING; } else name.m_Mode = Serialiser::READING; GET_SERIALISER->Serialise(#name, static_cast<type&>(name));
#define SERIALISE_ELEMENT_OPT(type, name, inValue, Condition) type name = type(); if(Condition) { if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name); }
#define SERIALISE_ELEMENT_ARR(type, name, inValues, count) type *name = new type[count]; for(size_t serialiseIdx=0; serialiseIdx < count; serialiseIdx++) { if(m_State >= WRITING) name[serialiseIdx] = (inValues)[serialiseIdx]; GET_SERIALISER->Serialise(#name, name[serialiseIdx]); }