Add deserialization code.
This commit is contained in:
parent
7fe5176e41
commit
747f7d92b9
@ -7,7 +7,7 @@ force_inline void free_serializer (Serializer* serializer);
|
|||||||
// force_inline ArrayView<u8> to_view (Serializer* serializer); #redundant, just call to_view (ArenaArray<T>&)
|
// force_inline ArrayView<u8> to_view (Serializer* serializer); #redundant, just call to_view (ArenaArray<T>&)
|
||||||
|
|
||||||
template <typename T> force_inline void Add (Serializer* serializer, T item) {
|
template <typename T> 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);
|
s64 final_count = serializer->allocated + sizeof(T);
|
||||||
|
|
||||||
if (serializer->allocated < final_count) {
|
if (serializer->allocated < final_count) {
|
||||||
@ -20,7 +20,7 @@ template <typename T> force_inline void Add (Serializer* serializer, T item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> force_inline void AddArray_NoSize (Serializer* serializer, ArrayView<T> view) {
|
template <typename T> force_inline void AddArray_NoSize (Serializer* serializer, ArrayView<T> view) {
|
||||||
T* current_point = &serializer->data[serializer->count];
|
u8* current_point = &serializer->data[serializer->count];
|
||||||
s64 final_count = serializer->allocated + (view.count * sizeof(T));
|
s64 final_count = serializer->allocated + (view.count * sizeof(T));
|
||||||
|
|
||||||
if (serializer->allocated < final_count) {
|
if (serializer->allocated < final_count) {
|
||||||
@ -53,3 +53,74 @@ template <typename T> force_inline void AddString16 (Serializer* serializer, str
|
|||||||
Add(serializer, string_length);
|
Add(serializer, string_length);
|
||||||
AddArray_NoSize(serializer, to_view(s));
|
AddArray_NoSize(serializer, to_view(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Deserializer { // downcasts to ArrayView<u8>
|
||||||
|
s64 count;
|
||||||
|
u8* data;
|
||||||
|
s64 cursor;
|
||||||
|
|
||||||
|
Deserializer (ArrayView<u8> view) {
|
||||||
|
count = view.count;
|
||||||
|
data = view.data;
|
||||||
|
cursor = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T> 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 <typename T> force_inline void ReadArrayView (Deserializer* ds, ArrayView<T>& 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 <typename T> force_inline void ReadArray (Deserializer* ds, ArrayView<T> view) {
|
||||||
|
u8* current_point = &ds->data[ds->cursor];
|
||||||
|
memcpy(view.data, current_point, view.count * sizeof(T));
|
||||||
|
|
||||||
|
ds->cursor += view.count * sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> force_inline ArrayView<T> ReadSizedArray (Deserializer* ds) { // #allocates
|
||||||
|
ArrayView<T> array;
|
||||||
|
|
||||||
|
Read(ds, &array.count);
|
||||||
|
array.data = NewArray<T>(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...
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user