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