MCPcopy Create free account
hub / github.com/SakuraEngine/SakuraEngine / serialize_impl

Function serialize_impl

modules/engine/runtime/src/ecs/serialize.cpp:29–98  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27}
28
29static void serialize_impl(const sugoi_chunk_view_t& view, sugoi_type_index_t type, EIndex offset, uint32_t size, uint32_t elemSize, skr_binary_writer_t* s, skr_binary_reader_t* ds
30, void (*serialize)(sugoi_chunk_t* chunk, EIndex index, char* data, EIndex count, skr_binary_writer_t* writer)
31, void (*deserialize)(sugoi_chunk_t* chunk, EIndex index, char* data, EIndex count, skr_binary_reader_t* writer))
32{
33 using namespace sugoi;
34 namespace bin = skr::binary;
35 bool isSeralize = s != nullptr;
36 char* src = view.chunk->data() + (size_t)offset + (size_t)size * view.start;
37 if (type_index_t(type).is_buffer())
38 {
39 // array component is pointer based and must be converted to persistent data format
40 if (isSeralize)
41 {
42 forloop (i, 0, view.count)
43 {
44 auto array = (sugoi_array_comp_t*)((size_t)i * size + src);
45 intptr_t padding = ((char*)array->BeginX - (char*)(array + 1));
46 intptr_t length = ((char*)array->EndX - (char*)array->BeginX);
47 bin::Archive(s, (uint32_t)padding);
48 bin::Archive(s, (uint32_t)length);
49 if (serialize)
50 serialize(view.chunk, view.start + i, (char*)array->BeginX, (EIndex)(length / elemSize), s);
51 else
52 ArchiveBuffer(s, (uint8_t*)array->BeginX, static_cast<uint32_t>(length));
53 }
54 }
55 else
56 {
57 forloop (i, 0, view.count)
58 {
59 auto array = (sugoi_array_comp_t*)((size_t)i * size + src);
60 uint32_t padding = 0, length = 0;
61 bin::Archive(ds, padding);
62 bin::Archive(ds, length);
63 if (padding > elemSize) // array on heap
64 {
65 array->BeginX = llvm_vecsmall::SmallVectorBase::allocate(length);
66 array->CapacityX = array->EndX = (char*)array->BeginX + length;
67 }
68 else
69 {
70 array->BeginX = (char*)(array + 1) + padding;
71 array->EndX = (char*)array->BeginX + length;
72 array->CapacityX = (char*)array + size;
73 }
74 if (deserialize)
75 deserialize(view.chunk, view.start + i, (char*)array->BeginX, (EIndex)length, ds);
76 else
77 ArchiveBuffer(ds, (uint8_t*)array->BeginX, length);
78 }
79 }
80 }
81 else
82 {
83 if (isSeralize)
84 {
85 if (serialize)
86 serialize(view.chunk, view.start, src, view.count, s);

Callers 1

serialize_viewMethod · 0.85

Calls 7

type_index_tClass · 0.85
ArchiveFunction · 0.85
serializeFunction · 0.85
ArchiveBufferFunction · 0.85
is_bufferMethod · 0.80
allocateFunction · 0.50
dataMethod · 0.45

Tested by

no test coverage detected