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