/*
* 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()