18bf80f4bSopenharmony_ci/*
28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License.
58bf80f4bSopenharmony_ci * You may obtain a copy of the License at
68bf80f4bSopenharmony_ci *
78bf80f4bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
88bf80f4bSopenharmony_ci *
98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and
138bf80f4bSopenharmony_ci * limitations under the License.
148bf80f4bSopenharmony_ci */
158bf80f4bSopenharmony_ci#include <base/math/matrix.h>
168bf80f4bSopenharmony_ci#include <base/math/quaternion.h>
178bf80f4bSopenharmony_ci#include <base/math/vector.h>
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ci#include <meta/base/meta_types.h>
208bf80f4bSopenharmony_ci#include <meta/base/namespace.h>
218bf80f4bSopenharmony_ci#include <meta/base/time_span.h>
228bf80f4bSopenharmony_ci#include <meta/ext/serialization/common_value_serializers.h>
238bf80f4bSopenharmony_ci#include <meta/interface/builtin_objects.h>
248bf80f4bSopenharmony_ci#include <meta/interface/detail/any.h>
258bf80f4bSopenharmony_ci#include <meta/interface/intf_iterable.h>
268bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h>
278bf80f4bSopenharmony_ci#include <meta/interface/intf_startable.h>
288bf80f4bSopenharmony_ci
298bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
308bf80f4bSopenharmony_ci
318bf80f4bSopenharmony_cinamespace Internal {
328bf80f4bSopenharmony_ci
338bf80f4bSopenharmony_ci// workaround for VC bug not being able to handle decltype(out.x) in lambda below
348bf80f4bSopenharmony_citemplate<typename T>
358bf80f4bSopenharmony_cistatic ISerNode::Ptr ExportVector(IExportFunctions& f, const T* v, size_t size)
368bf80f4bSopenharmony_ci{
378bf80f4bSopenharmony_ci    return f.ExportToNode(ArrayAny<T>(BASE_NS::array_view<const T>(v, v + size)));
388bf80f4bSopenharmony_ci}
398bf80f4bSopenharmony_ci
408bf80f4bSopenharmony_ci// workaround for VC bug not being able to handle decltype(out.x) in lambda below
418bf80f4bSopenharmony_citemplate<typename T>
428bf80f4bSopenharmony_cistatic bool ImportVector(IImportFunctions& f, const ISerNode::ConstPtr& node, T* out, size_t size)
438bf80f4bSopenharmony_ci{
448bf80f4bSopenharmony_ci    ArrayAny<T> arr;
458bf80f4bSopenharmony_ci    if (f.ImportFromNode(node, arr)) {
468bf80f4bSopenharmony_ci        const auto& vec = arr.InternalGetValue();
478bf80f4bSopenharmony_ci        if (vec.size() == size) {
488bf80f4bSopenharmony_ci            for (size_t i = 0; i != size; ++i) {
498bf80f4bSopenharmony_ci                out[i] = vec[i];
508bf80f4bSopenharmony_ci            }
518bf80f4bSopenharmony_ci            return true;
528bf80f4bSopenharmony_ci        }
538bf80f4bSopenharmony_ci    }
548bf80f4bSopenharmony_ci    return false;
558bf80f4bSopenharmony_ci};
568bf80f4bSopenharmony_ci
578bf80f4bSopenharmony_civoid RegisterValueSerializers(IObjectRegistry& registry)
588bf80f4bSopenharmony_ci{
598bf80f4bSopenharmony_ci    auto vecExport = [](IExportFunctions& f, const auto& v) {
608bf80f4bSopenharmony_ci        constexpr size_t size = sizeof(v.data) / sizeof(v.data[0]); /*NOLINT(bugprone-sizeof-expression)*/
618bf80f4bSopenharmony_ci        return ExportVector(f, v.data, size);
628bf80f4bSopenharmony_ci    };
638bf80f4bSopenharmony_ci    auto vecImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) {
648bf80f4bSopenharmony_ci        constexpr size_t size = sizeof(out.data) / sizeof(out.data[0]); /*NOLINT(bugprone-sizeof-expression)*/
658bf80f4bSopenharmony_ci        return ImportVector(f, node, out.data, size);
668bf80f4bSopenharmony_ci    };
678bf80f4bSopenharmony_ci    auto matExport = [](IExportFunctions& f, const auto& v) {
688bf80f4bSopenharmony_ci        constexpr size_t size = sizeof(v.base) / sizeof(v.base[0]); /*NOLINT(bugprone-sizeof-expression)*/
698bf80f4bSopenharmony_ci        return ExportVector(f, v.base, size);
708bf80f4bSopenharmony_ci    };
718bf80f4bSopenharmony_ci    auto matImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) {
728bf80f4bSopenharmony_ci        constexpr size_t size = sizeof(out.base) / sizeof(out.base[0]); /*NOLINT(bugprone-sizeof-expression)*/
738bf80f4bSopenharmony_ci        return ImportVector(f, node, out.base, size);
748bf80f4bSopenharmony_ci    };
758bf80f4bSopenharmony_ci    auto enumExport = [](IExportFunctions& f, const auto& v) { return EnumExport(f, v); };
768bf80f4bSopenharmony_ci    auto enumImport = [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) {
778bf80f4bSopenharmony_ci        return EnumImport(f, node, out);
788bf80f4bSopenharmony_ci    };
798bf80f4bSopenharmony_ci
808bf80f4bSopenharmony_ci    auto& data = registry.GetGlobalSerializationData();
818bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Vec2>(data, vecExport, vecImport);
828bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Vec3>(data, vecExport, vecImport);
838bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Vec4>(data, vecExport, vecImport);
848bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::UVec2>(data, vecExport, vecImport);
858bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::UVec3>(data, vecExport, vecImport);
868bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::UVec4>(data, vecExport, vecImport);
878bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::IVec2>(data, vecExport, vecImport);
888bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::IVec3>(data, vecExport, vecImport);
898bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::IVec4>(data, vecExport, vecImport);
908bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Quat>(data, vecExport, vecImport);
918bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Mat3X3>(data, matExport, matImport);
928bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Math::Mat4X4>(data, matExport, matImport);
938bf80f4bSopenharmony_ci
948bf80f4bSopenharmony_ci    RegisterSerializer<BASE_NS::Uid>(
958bf80f4bSopenharmony_ci        data,
968bf80f4bSopenharmony_ci        [](IExportFunctions& f, const auto& v) {
978bf80f4bSopenharmony_ci            return f.ExportToNode(Any<BASE_NS::string>(BASE_NS::to_string(v).c_str()));
988bf80f4bSopenharmony_ci        },
998bf80f4bSopenharmony_ci        [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) {
1008bf80f4bSopenharmony_ci            Any<BASE_NS::string> any;
1018bf80f4bSopenharmony_ci            if (f.ImportFromNode(node, any)) {
1028bf80f4bSopenharmony_ci                out = BASE_NS::StringToUid(any.InternalGetValue());
1038bf80f4bSopenharmony_ci                return true;
1048bf80f4bSopenharmony_ci            }
1058bf80f4bSopenharmony_ci            return false;
1068bf80f4bSopenharmony_ci        });
1078bf80f4bSopenharmony_ci
1088bf80f4bSopenharmony_ci    RegisterSerializer<TimeSpan>(
1098bf80f4bSopenharmony_ci        data, [](IExportFunctions& f, const auto& v) { return f.ExportToNode(Any<int64_t>(v.ToMicroseconds())); },
1108bf80f4bSopenharmony_ci        [](IImportFunctions& f, const ISerNode::ConstPtr& node, auto& out) {
1118bf80f4bSopenharmony_ci            Any<int64_t> any;
1128bf80f4bSopenharmony_ci            if (f.ImportFromNode(node, any)) {
1138bf80f4bSopenharmony_ci                out = TimeSpan::Microseconds(any.InternalGetValue());
1148bf80f4bSopenharmony_ci                return true;
1158bf80f4bSopenharmony_ci            }
1168bf80f4bSopenharmony_ci            return false;
1178bf80f4bSopenharmony_ci        });
1188bf80f4bSopenharmony_ci
1198bf80f4bSopenharmony_ci    RegisterSerializer<StartableState>(data, enumExport, enumImport);
1208bf80f4bSopenharmony_ci    RegisterSerializer<StartBehavior>(data, enumExport, enumImport);
1218bf80f4bSopenharmony_ci    RegisterSerializer<TraversalType>(data, enumExport, enumImport);
1228bf80f4bSopenharmony_ci}
1238bf80f4bSopenharmony_ci
1248bf80f4bSopenharmony_civoid UnRegisterValueSerializers(IObjectRegistry& registry)
1258bf80f4bSopenharmony_ci{
1268bf80f4bSopenharmony_ci    auto& data = registry.GetGlobalSerializationData();
1278bf80f4bSopenharmony_ci    UnregisterSerializer<TraversalType>(data);
1288bf80f4bSopenharmony_ci    UnregisterSerializer<StartBehavior>(data);
1298bf80f4bSopenharmony_ci    UnregisterSerializer<StartableState>(data);
1308bf80f4bSopenharmony_ci    UnregisterSerializer<TimeSpan>(data);
1318bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Uid>(data);
1328bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Mat4X4>(data);
1338bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Mat3X3>(data);
1348bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Quat>(data);
1358bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::IVec4>(data);
1368bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::IVec3>(data);
1378bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::IVec2>(data);
1388bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::UVec4>(data);
1398bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::UVec3>(data);
1408bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::UVec2>(data);
1418bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Vec4>(data);
1428bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Vec3>(data);
1438bf80f4bSopenharmony_ci    UnregisterSerializer<BASE_NS::Math::Vec2>(data);
1448bf80f4bSopenharmony_ci}
1458bf80f4bSopenharmony_ci
1468bf80f4bSopenharmony_ci} // namespace Internal
1478bf80f4bSopenharmony_ciMETA_END_NAMESPACE()
148