void ChildListType::deserialize(ChildList& list, const ArchiveNode& node, IUniverse& universe) const { if (node.is_array()) { for (size_t i = 0; i < node.array_size(); ++i) { const ArchiveNode& child = node[i]; ObjectPtr<> ptr = deserialize_object(child, universe); if (ptr != nullptr) { list.push_back(std::move(ptr)); } } } }
void VariableLengthArrayType<T>::deserialize(T& obj, const ArchiveNode& node, IUniverse& universe) const { if (node.is_array()) { size_t sz = node.array_size(); obj.reserve(sz); for (size_t i = 0; i < sz; ++i) { ElementType element; get_type<ElementType>()->deserialize(reinterpret_cast<byte*>(&element), node[i], universe); obj.push_back(std::move(element)); } } }
void VariableLengthArrayType<T>::deserialize(byte* place, const ArchiveNode& node) const { T* obj = reinterpret_cast<T*>(place); if (node.is_array()) { size_t sz = node.array_size(); obj->reserve(sz); for (size_t i = 0; i < sz; ++i) { ElementType element; get_type<ElementType>()->deserialize(reinterpret_cast<byte*>(&element), node[i]); obj->push_back(std::move(element)); } } }
void VariableLengthArrayType<T>::serialize(const byte* place, ArchiveNode& node) const { const T* obj = reinterpret_cast<const T*>(place); for (auto& it: *obj) { ArchiveNode& element = node.array_push(); get_type<ElementType>()->serialize(reinterpret_cast<const byte*>(&it), element); } }
ObjectPtr<> deserialize_object(const ArchiveNode& node, IUniverse& universe) { if (!node.is_map()) { std::cerr << "Expected object, got non-map.\n"; return nullptr; } std::string error; const DerivedType* type = get_type_from_map(node, error); if (type == nullptr) { std::cerr << "ERROR: " << error << '\n'; return nullptr; } std::string id; if (!node["id"].get(id)) { std::cerr << "WARNING: Object without id.\n"; } ObjectPtr<> ptr = universe.create_object(type, id); if (ptr->object_id() != id) { std::cerr << "WARNING: Object '" << id << "' was renamed to '" << ptr->object_id() << "' because of a collision.\n"; } type->deserialize(reinterpret_cast<byte*>(ptr.get()), node, universe); return ptr; }
void ChildListType::serialize(const ChildList& list, ArchiveNode& node, IUniverse& universe) const { for (auto& child: list) { ArchiveNode& child_node = node.array_push(); ::serialize(*child, child_node, universe); } }
void VariableLengthArrayType<T>::serialize(const T& obj, ArchiveNode& node, IUniverse& universe) const { for (auto& it: obj) { ArchiveNode& element = node.array_push(); get_type<ElementType>()->serialize(reinterpret_cast<const byte*>(&it), element, universe); } }