typedef ArenaArray Serializer; force_inline Serializer* new_serializer (Arena_Reserve new_reserve=Arena_Reserve::Size_2G); force_inline void reset_serializer (Serializer* serializer); 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]; s64 final_count = serializer->allocated + sizeof(T); if (serializer->allocated < final_count) { array_reserve(*serializer, final_count); } memcpy(current_point, &item, sizeof(T)); serializer->count += sizeof(T); } template force_inline void AddArray_NoSize (Serializer* serializer, ArrayView view) { T* current_point = &serializer->data[serializer->count]; s64 final_count = serializer->allocated + (view.count * sizeof(T)); if (serializer->allocated < final_count) { array_reserve(*serializer, final_count); } memcpy(current_point, view.data, view.count * sizeof(T)); serializer->count += view.count * sizeof(T); } template force_inline void AddArray (Serializer* serializer, ArrayView view) { Add(serializer, view.count); AddArray_NoSize(serializer, view); } template force_inline void AddString (Serializer* serializer, string s) { Add(serializer, s.count); AddArray_NoSize(serializer, to_view(s)); } template force_inline void AddString32 (Serializer* serializer, string s) { u32 string_length = (u32)s.count; Add(serializer, string_length); AddArray_NoSize(serializer, to_view(s)); } template force_inline void AddString16 (Serializer* serializer, string s) { u16 string_length = (u16)s.count; Add(serializer, string_length); AddArray_NoSize(serializer, to_view(s)); }