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 168bf80f4bSopenharmony_ci#ifndef META_SRC_SERIALIZATION_SER_NODES_H 178bf80f4bSopenharmony_ci#define META_SRC_SERIALIZATION_SER_NODES_H 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h> 228bf80f4bSopenharmony_ci#include <meta/base/type_traits.h> 238bf80f4bSopenharmony_ci#include <meta/base/version.h> 248bf80f4bSopenharmony_ci#include <meta/ext/minimal_object.h> 258bf80f4bSopenharmony_ci#include <meta/ext/object_factory.h> 268bf80f4bSopenharmony_ci#include <meta/interface/intf_object_factory.h> 278bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_ser_node.h> 288bf80f4bSopenharmony_ci 298bf80f4bSopenharmony_ci#include "../base_object.h" 308bf80f4bSopenharmony_ci 318bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 328bf80f4bSopenharmony_cinamespace Serialization { 338bf80f4bSopenharmony_ci 348bf80f4bSopenharmony_ciclass NilNode : public Internal::BaseObjectFwd<NilNode, ClassId::NilNode, INilNode> { 358bf80f4bSopenharmony_cipublic: 368bf80f4bSopenharmony_ci NilNode() = default; 378bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 388bf80f4bSopenharmony_ci { 398bf80f4bSopenharmony_ci v.Visit(*this); 408bf80f4bSopenharmony_ci } 418bf80f4bSopenharmony_ci}; 428bf80f4bSopenharmony_ci 438bf80f4bSopenharmony_ciclass MapNode : public Internal::BaseObjectFwd<MapNode, ClassId::MapNode, IMapNode> { 448bf80f4bSopenharmony_cipublic: 458bf80f4bSopenharmony_ci MapNode() = default; 468bf80f4bSopenharmony_ci MapNode(BASE_NS::vector<NamedNode> elements) : elements(BASE_NS::move(elements)) {} 478bf80f4bSopenharmony_ci 488bf80f4bSopenharmony_ci BASE_NS::vector<NamedNode> GetMembers() const override 498bf80f4bSopenharmony_ci { 508bf80f4bSopenharmony_ci return elements; 518bf80f4bSopenharmony_ci } 528bf80f4bSopenharmony_ci 538bf80f4bSopenharmony_ci ISerNode::Ptr FindNode(BASE_NS::string_view name) const override 548bf80f4bSopenharmony_ci { 558bf80f4bSopenharmony_ci for (auto&& v : elements) { 568bf80f4bSopenharmony_ci if (name == v.name) { 578bf80f4bSopenharmony_ci return v.node; 588bf80f4bSopenharmony_ci } 598bf80f4bSopenharmony_ci } 608bf80f4bSopenharmony_ci return nullptr; 618bf80f4bSopenharmony_ci } 628bf80f4bSopenharmony_ci 638bf80f4bSopenharmony_ci void AddNode(BASE_NS::string_view name, ISerNode::Ptr n) override 648bf80f4bSopenharmony_ci { 658bf80f4bSopenharmony_ci elements.push_back(NamedNode { BASE_NS::string(name), BASE_NS::move(n) }); 668bf80f4bSopenharmony_ci } 678bf80f4bSopenharmony_ci 688bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 698bf80f4bSopenharmony_ci { 708bf80f4bSopenharmony_ci v.Visit(*this); 718bf80f4bSopenharmony_ci } 728bf80f4bSopenharmony_ci 738bf80f4bSopenharmony_cipublic: 748bf80f4bSopenharmony_ci BASE_NS::vector<NamedNode> elements; 758bf80f4bSopenharmony_ci}; 768bf80f4bSopenharmony_ci 778bf80f4bSopenharmony_ciclass ArrayNode : public Internal::BaseObjectFwd<ArrayNode, ClassId::ArrayNode, IArrayNode> { 788bf80f4bSopenharmony_cipublic: 798bf80f4bSopenharmony_ci ArrayNode() = default; 808bf80f4bSopenharmony_ci ArrayNode(BASE_NS::vector<ISerNode::Ptr> elements) : elements(BASE_NS::move(elements)) {} 818bf80f4bSopenharmony_ci 828bf80f4bSopenharmony_ci BASE_NS::vector<ISerNode::Ptr> GetMembers() const override 838bf80f4bSopenharmony_ci { 848bf80f4bSopenharmony_ci return elements; 858bf80f4bSopenharmony_ci } 868bf80f4bSopenharmony_ci 878bf80f4bSopenharmony_ci void AddNode(const ISerNode::Ptr& node) override 888bf80f4bSopenharmony_ci { 898bf80f4bSopenharmony_ci elements.push_back(node); 908bf80f4bSopenharmony_ci } 918bf80f4bSopenharmony_ci 928bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 938bf80f4bSopenharmony_ci { 948bf80f4bSopenharmony_ci v.Visit(*this); 958bf80f4bSopenharmony_ci } 968bf80f4bSopenharmony_ci 978bf80f4bSopenharmony_cipublic: 988bf80f4bSopenharmony_ci BASE_NS::vector<ISerNode::Ptr> elements; 998bf80f4bSopenharmony_ci}; 1008bf80f4bSopenharmony_ci 1018bf80f4bSopenharmony_ciclass ObjectNode : public Internal::BaseObjectFwd<ObjectNode, ClassId::ObjectNode, IObjectNode> { 1028bf80f4bSopenharmony_cipublic: 1038bf80f4bSopenharmony_ci ObjectNode() = default; 1048bf80f4bSopenharmony_ci ObjectNode(BASE_NS::string className, BASE_NS::string name, const ObjectId& oid, const InstanceId& iid, 1058bf80f4bSopenharmony_ci ISerNode::Ptr members) 1068bf80f4bSopenharmony_ci : className(BASE_NS::move(className)), name(BASE_NS::move(name)), objectType(oid), instance(iid), 1078bf80f4bSopenharmony_ci members(BASE_NS::move(members)) 1088bf80f4bSopenharmony_ci {} 1098bf80f4bSopenharmony_ci 1108bf80f4bSopenharmony_ci BASE_NS::string GetObjectClassName() const override 1118bf80f4bSopenharmony_ci { 1128bf80f4bSopenharmony_ci return className; 1138bf80f4bSopenharmony_ci } 1148bf80f4bSopenharmony_ci BASE_NS::string GetObjectName() const override 1158bf80f4bSopenharmony_ci { 1168bf80f4bSopenharmony_ci return name; 1178bf80f4bSopenharmony_ci } 1188bf80f4bSopenharmony_ci ObjectId GetObjectId() const override 1198bf80f4bSopenharmony_ci { 1208bf80f4bSopenharmony_ci return objectType; 1218bf80f4bSopenharmony_ci } 1228bf80f4bSopenharmony_ci InstanceId GetInstanceId() const override 1238bf80f4bSopenharmony_ci { 1248bf80f4bSopenharmony_ci return instance; 1258bf80f4bSopenharmony_ci } 1268bf80f4bSopenharmony_ci ISerNode::Ptr GetMembers() const override 1278bf80f4bSopenharmony_ci { 1288bf80f4bSopenharmony_ci return members; 1298bf80f4bSopenharmony_ci } 1308bf80f4bSopenharmony_ci 1318bf80f4bSopenharmony_ci void SetObjectClassName(BASE_NS::string name) override 1328bf80f4bSopenharmony_ci { 1338bf80f4bSopenharmony_ci className = BASE_NS::move(name); 1348bf80f4bSopenharmony_ci } 1358bf80f4bSopenharmony_ci void SetObjectName(BASE_NS::string name) override 1368bf80f4bSopenharmony_ci { 1378bf80f4bSopenharmony_ci className = BASE_NS::move(name); 1388bf80f4bSopenharmony_ci } 1398bf80f4bSopenharmony_ci void SetObjectId(ObjectId id) override 1408bf80f4bSopenharmony_ci { 1418bf80f4bSopenharmony_ci objectType = id; 1428bf80f4bSopenharmony_ci } 1438bf80f4bSopenharmony_ci void SetInstanceId(InstanceId id) override 1448bf80f4bSopenharmony_ci { 1458bf80f4bSopenharmony_ci instance = id; 1468bf80f4bSopenharmony_ci } 1478bf80f4bSopenharmony_ci void SetMembers(ISerNode::Ptr n) override 1488bf80f4bSopenharmony_ci { 1498bf80f4bSopenharmony_ci members = BASE_NS::move(n); 1508bf80f4bSopenharmony_ci } 1518bf80f4bSopenharmony_ci 1528bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 1538bf80f4bSopenharmony_ci { 1548bf80f4bSopenharmony_ci v.Visit(*this); 1558bf80f4bSopenharmony_ci } 1568bf80f4bSopenharmony_ci 1578bf80f4bSopenharmony_cipublic: 1588bf80f4bSopenharmony_ci BASE_NS::string className; 1598bf80f4bSopenharmony_ci BASE_NS::string name; 1608bf80f4bSopenharmony_ci ObjectId objectType; 1618bf80f4bSopenharmony_ci InstanceId instance; 1628bf80f4bSopenharmony_ci ISerNode::Ptr members; 1638bf80f4bSopenharmony_ci}; 1648bf80f4bSopenharmony_ci 1658bf80f4bSopenharmony_ciclass RootNode : public Internal::BaseObjectFwd<RootNode, ClassId::RootNode, IRootNode> { 1668bf80f4bSopenharmony_cipublic: 1678bf80f4bSopenharmony_ci RootNode() = default; 1688bf80f4bSopenharmony_ci RootNode(const Version& ver, ISerNode::Ptr obj) : serializerVersion_(ver), object(BASE_NS::move(obj)) {} 1698bf80f4bSopenharmony_ci 1708bf80f4bSopenharmony_ci Version GetSerializerVersion() const override 1718bf80f4bSopenharmony_ci { 1728bf80f4bSopenharmony_ci return serializerVersion_; 1738bf80f4bSopenharmony_ci } 1748bf80f4bSopenharmony_ci ISerNode::Ptr GetObject() const override 1758bf80f4bSopenharmony_ci { 1768bf80f4bSopenharmony_ci return object; 1778bf80f4bSopenharmony_ci } 1788bf80f4bSopenharmony_ci 1798bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 1808bf80f4bSopenharmony_ci { 1818bf80f4bSopenharmony_ci v.Visit(*this); 1828bf80f4bSopenharmony_ci } 1838bf80f4bSopenharmony_ci 1848bf80f4bSopenharmony_cipublic: 1858bf80f4bSopenharmony_ci Version serializerVersion_ { 1, 0 }; 1868bf80f4bSopenharmony_ci ISerNode::Ptr object; 1878bf80f4bSopenharmony_ci}; 1888bf80f4bSopenharmony_ci 1898bf80f4bSopenharmony_citemplate<typename Type, const META_NS::ClassInfo& ClassInfo> 1908bf80f4bSopenharmony_ciclass BuiltinValueNode 1918bf80f4bSopenharmony_ci : public Internal::BaseObjectFwd<BuiltinValueNode<Type, ClassInfo>, ClassInfo, IBuiltinValueNode<Type>> { 1928bf80f4bSopenharmony_cipublic: 1938bf80f4bSopenharmony_ci using InterfaceType = IBuiltinValueNode<Type>; 1948bf80f4bSopenharmony_ci 1958bf80f4bSopenharmony_ci BuiltinValueNode() = default; 1968bf80f4bSopenharmony_ci BuiltinValueNode(const Type& v) : value(v) {} 1978bf80f4bSopenharmony_ci 1988bf80f4bSopenharmony_ci Type GetValue() const override 1998bf80f4bSopenharmony_ci { 2008bf80f4bSopenharmony_ci return value; 2018bf80f4bSopenharmony_ci } 2028bf80f4bSopenharmony_ci 2038bf80f4bSopenharmony_ci void SetValue(const Type& v) override 2048bf80f4bSopenharmony_ci { 2058bf80f4bSopenharmony_ci value = v; 2068bf80f4bSopenharmony_ci } 2078bf80f4bSopenharmony_ci 2088bf80f4bSopenharmony_ci void Apply(ISerNodeVisitor& v) override 2098bf80f4bSopenharmony_ci { 2108bf80f4bSopenharmony_ci v.Visit(*this); 2118bf80f4bSopenharmony_ci } 2128bf80f4bSopenharmony_ci 2138bf80f4bSopenharmony_cipublic: 2148bf80f4bSopenharmony_ci Type value {}; 2158bf80f4bSopenharmony_ci}; 2168bf80f4bSopenharmony_ci 2178bf80f4bSopenharmony_ciusing BoolNode = BuiltinValueNode<bool, ClassId::BoolNode>; 2188bf80f4bSopenharmony_ciusing IntNode = BuiltinValueNode<int64_t, ClassId::IntNode>; 2198bf80f4bSopenharmony_ciusing UIntNode = BuiltinValueNode<uint64_t, ClassId::UIntNode>; 2208bf80f4bSopenharmony_ciusing DoubleNode = BuiltinValueNode<double, ClassId::DoubleNode>; 2218bf80f4bSopenharmony_ciusing StringNode = BuiltinValueNode<BASE_NS::string, ClassId::StringNode>; 2228bf80f4bSopenharmony_ciusing RefNode = BuiltinValueNode<RefUri, ClassId::RefNode>; 2238bf80f4bSopenharmony_ci 2248bf80f4bSopenharmony_citemplate<typename Type, typename Node> 2258bf80f4bSopenharmony_cistruct SupportedType { 2268bf80f4bSopenharmony_ci using NodeType = Node; 2278bf80f4bSopenharmony_ci constexpr const static TypeId ID = UidFromType<Type>(); 2288bf80f4bSopenharmony_ci 2298bf80f4bSopenharmony_ci static ISerNode::Ptr CreateNode(const IAny& any) 2308bf80f4bSopenharmony_ci { 2318bf80f4bSopenharmony_ci return ISerNode::Ptr(new NodeType(GetValue<Type>(any))); 2328bf80f4bSopenharmony_ci } 2338bf80f4bSopenharmony_ci 2348bf80f4bSopenharmony_ci static AnyReturnValue ExtractValue(const ISerNode::ConstPtr& n, IAny& any) 2358bf80f4bSopenharmony_ci { 2368bf80f4bSopenharmony_ci Type v {}; 2378bf80f4bSopenharmony_ci if (auto node = interface_cast<typename NodeType::InterfaceType>(n)) { 2388bf80f4bSopenharmony_ci v = static_cast<Type>(node->GetValue()); 2398bf80f4bSopenharmony_ci } else { 2408bf80f4bSopenharmony_ci if constexpr (BASE_NS::is_same_v<NodeType, IntNode> || BASE_NS::is_same_v<NodeType, DoubleNode>) { 2418bf80f4bSopenharmony_ci if (auto node = interface_cast<UIntNode::InterfaceType>(n)) { 2428bf80f4bSopenharmony_ci v = static_cast<Type>(node->GetValue()); 2438bf80f4bSopenharmony_ci } else if (auto node = interface_cast<IntNode::InterfaceType>(n)) { 2448bf80f4bSopenharmony_ci v = static_cast<Type>(node->GetValue()); 2458bf80f4bSopenharmony_ci } 2468bf80f4bSopenharmony_ci } 2478bf80f4bSopenharmony_ci } 2488bf80f4bSopenharmony_ci return any.SetValue(v); 2498bf80f4bSopenharmony_ci } 2508bf80f4bSopenharmony_ci}; 2518bf80f4bSopenharmony_ci 2528bf80f4bSopenharmony_ci// clang-format off 2538bf80f4bSopenharmony_ciusing SupportedBuiltins = TypeList< 2548bf80f4bSopenharmony_ci SupportedType<bool, BoolNode>, 2558bf80f4bSopenharmony_ci SupportedType<double, DoubleNode>, 2568bf80f4bSopenharmony_ci SupportedType<uint8_t, UIntNode>, 2578bf80f4bSopenharmony_ci SupportedType<uint16_t, UIntNode>, 2588bf80f4bSopenharmony_ci SupportedType<uint32_t, UIntNode>, 2598bf80f4bSopenharmony_ci SupportedType<uint64_t, UIntNode>, 2608bf80f4bSopenharmony_ci SupportedType<int8_t, IntNode>, 2618bf80f4bSopenharmony_ci SupportedType<int16_t, IntNode>, 2628bf80f4bSopenharmony_ci SupportedType<int32_t, IntNode>, 2638bf80f4bSopenharmony_ci SupportedType<int64_t, IntNode>, 2648bf80f4bSopenharmony_ci SupportedType<BASE_NS::string, StringNode>, 2658bf80f4bSopenharmony_ci SupportedType<RefUri, RefNode> 2668bf80f4bSopenharmony_ci >; 2678bf80f4bSopenharmony_ci// clang-format on 2688bf80f4bSopenharmony_ci 2698bf80f4bSopenharmony_ci} // namespace Serialization 2708bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 2718bf80f4bSopenharmony_ci 2728bf80f4bSopenharmony_ci#endif 273