From 747f7d92b900d86bfa4d62b037047bbc94543578 Mon Sep 17 00:00:00 2001 From: Musa Mahmood Date: Fri, 28 Nov 2025 09:39:23 -0500 Subject: [PATCH] Add deserialization code. --- lib/Base/Serializer.cpp | 2 +- lib/Base/Serializer.h | 75 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/lib/Base/Serializer.cpp b/lib/Base/Serializer.cpp index b2a5c7d..e77a68a 100644 --- a/lib/Base/Serializer.cpp +++ b/lib/Base/Serializer.cpp @@ -11,4 +11,4 @@ force_inline void free_serializer (Serializer* serializer) { arena_array_free(*serializer); } -// #redundant to_view () #note, just call to_view (ArenaArray&) \ No newline at end of file +// #redundant to_view () #note, just call to_view (ArenaArray&) diff --git a/lib/Base/Serializer.h b/lib/Base/Serializer.h index 9b91154..0e3c242 100644 --- a/lib/Base/Serializer.h +++ b/lib/Base/Serializer.h @@ -7,7 +7,7 @@ force_inline void free_serializer (Serializer* serializer); // force_inline ArrayView to_view (Serializer* serializer); #redundant, just call to_view (ArenaArray&) template force_inline void Add (Serializer* serializer, T item) { - T* current_point = &serializer->data[serializer->count]; + u8* current_point = &serializer->data[serializer->count]; s64 final_count = serializer->allocated + sizeof(T); if (serializer->allocated < final_count) { @@ -20,7 +20,7 @@ template force_inline void Add (Serializer* serializer, T item) { } template force_inline void AddArray_NoSize (Serializer* serializer, ArrayView view) { - T* current_point = &serializer->data[serializer->count]; + u8* current_point = &serializer->data[serializer->count]; s64 final_count = serializer->allocated + (view.count * sizeof(T)); if (serializer->allocated < final_count) { @@ -53,3 +53,74 @@ template force_inline void AddString16 (Serializer* serializer, str Add(serializer, string_length); AddArray_NoSize(serializer, to_view(s)); } + +struct Deserializer { // downcasts to ArrayView + s64 count; + u8* data; + s64 cursor; + + Deserializer (ArrayView view) { + count = view.count; + data = view.data; + cursor = 0; + } +}; + +template force_inline void Read (Deserializer* ds, T* item) { + u8* current_point = &ds->data[ds->cursor]; + + memcpy(item, current_point, sizeof(T)); + + ds->cursor += sizeof(T); +} + +template force_inline void ReadArrayView (Deserializer* ds, ArrayView& view, s64 view_count) { + view.count = view_count; + view.data = &ds->data[ds->cursor]; + + ds->cursor += (view_count * sizeof(T)); +} + +// Here array should be allocated and have a non-zero count! +template force_inline void ReadArray (Deserializer* ds, ArrayView view) { + u8* current_point = &ds->data[ds->cursor]; + memcpy(view.data, current_point, view.count * sizeof(T)); + + ds->cursor += view.count * sizeof(T); +} + +template force_inline ArrayView ReadSizedArray (Deserializer* ds) { // #allocates + ArrayView array; + + Read(ds, &array.count); + array.data = NewArray(array.count, false); + ReadArray(ds, array); + + return array; +} + +force_inline void ReadStringView (Deserializer* ds, string& sv, s64 view_count) { + sv.count = view_count; + sv.data = &ds->data[ds->cursor]; + + ds->cursor += view_count; +} + +force_inline void ReadString (Deserializer* ds, string& s) { // #no_alloc + Read(ds, &s.count); + ReadStringView(ds, s, s.count); +} + +force_inline void ReadString32 (Deserializer* ds, string& s) { // #no_alloc + u32 str_len = 0; + Read(ds, &str_len); + ReadStringView(ds, s, (s64)str_len); +} + +force_inline void ReadString16 (Deserializer* ds, string& s) { // #no_alloc + u16 str_len = 0; + Read(ds, &str_len); + ReadStringView(ds, s, (s64)str_len); +} + +// ReadString_MakeCopy...