/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include META_BEGIN_NAMESPACE() namespace Internal { // workaround for VC bug not being able to handle decltype(out.x) in lambda below template static ISerNode::Ptr ExportVector(IExportFunctions& f, const T* v, size_t size) { return f.ExportToNode(ArrayAny(BASE_NS::array_view(v, v + size))); } // workaround for VC bug not being able to handle decltype(out.x) in lambda below template static bool ImportVector(IImportFunctions& f, const ISerNode::ConstPtr& node, T* out, size_t size) { ArrayAny arr; if (f.ImportFromNode(node, arr)) { const auto& vec = arr.InternalGetValue(); if (vec.size() == size) { for (size_t i = 0; i != size; ++i) { out[i] = vec[i]; } return true; } } return false; }; void RegisterValueSerializers(IObjectRegistry& registry) { auto vecExport = [](IExportFunctions& f, const auto& v) { constexpr size_t size = sizeof(v.data) / sizeof(v.data[0]); /*NOLINT(bugprone-sizeof-expression)*/ return ExportVector(f, v.data, size); }; auto vecImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) { constexpr size_t size = sizeof(out.data) / sizeof(out.data[0]); /*NOLINT(bugprone-sizeof-expression)*/ return ImportVector(f, node, out.data, size); }; auto matExport = [](IExportFunctions& f, const auto& v) { constexpr size_t size = sizeof(v.base) / sizeof(v.base[0]); /*NOLINT(bugprone-sizeof-expression)*/ return ExportVector(f, v.base, size); }; auto matImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) { constexpr size_t size = sizeof(out.base) / sizeof(out.base[0]); /*NOLINT(bugprone-sizeof-expression)*/ return ImportVector(f, node, out.base, size); }; auto enumExport = [](IExportFunctions& f, const auto& v) { return EnumExport(f, v); }; auto enumImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) { return EnumImport(f, node, out); }; auto& data = registry.GetGlobalSerializationData(); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, vecExport, vecImport); RegisterSerializer(data, matExport, matImport); RegisterSerializer(data, matExport, matImport); RegisterSerializer( data, [](IExportFunctions& f, const auto& v) { return f.ExportToNode(Any(BASE_NS::to_string(v).c_str())); }, [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) { Any any; if (f.ImportFromNode(node, any)) { out = BASE_NS::StringToUid(any.InternalGetValue()); return true; } return false; }); RegisterSerializer( data, [](IExportFunctions& f, const auto& v) { return f.ExportToNode(Any(v.ToMicroseconds())); }, [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) { Any any; if (f.ImportFromNode(node, any)) { out = TimeSpan::Microseconds(any.InternalGetValue()); return true; } return false; }); RegisterSerializer(data, enumExport, enumImport); RegisterSerializer(data, enumExport, enumImport); RegisterSerializer(data, enumExport, enumImport); } void UnRegisterValueSerializers(IObjectRegistry& registry) { auto& data = registry.GetGlobalSerializationData(); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); UnregisterSerializer(data); } } // namespace Internal META_END_NAMESPACE()