1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef META_INTERFACE_SERIALIZATION_ISER_NODE_H 17 #define META_INTERFACE_SERIALIZATION_ISER_NODE_H 18 19 #include <core/plugin/intf_interface.h> 20 21 #include <meta/base/interface_macros.h> 22 #include <meta/base/namespace.h> 23 #include <meta/base/ref_uri.h> 24 #include <meta/base/version.h> 25 #include <meta/interface/serialization/ser_metadata.h> 26 27 META_BEGIN_NAMESPACE() 28 29 class ISerNodeVisitor; 30 31 /// Serialisation intermediate form base node type 32 class ISerNode : public CORE_NS::IInterface { 33 META_INTERFACE(CORE_NS::IInterface, ISerNode, "eea35313-5add-4408-ae62-0dd7464b986c") 34 public: 35 /// Apply visitor for the node 36 virtual void Apply(ISerNodeVisitor&) = 0; 37 }; 38 39 /// Serialisation intermediate form root node 40 class IRootNode : public ISerNode { 41 META_INTERFACE(ISerNode, IRootNode, "d42016dc-3941-463b-b332-b101ca2a9665") 42 public: 43 /// Get metadata 44 virtual SerMetadata GetMetadata() const = 0; 45 /// Get root object 46 virtual ISerNode::Ptr GetObject() const = 0; 47 48 virtual void SetMetadata(SerMetadata) = 0; 49 virtual void SetObject(ISerNode::Ptr) = 0; 50 }; 51 52 /// Serialisation intermediate form nil node 53 class INilNode : public ISerNode { 54 META_INTERFACE(ISerNode, INilNode, "d2712b6e-5c3c-4355-8c63-e039b946afdb") 55 public: 56 }; 57 58 /// Serialisation intermediate form object node 59 class IObjectNode : public ISerNode { 60 META_INTERFACE(ISerNode, IObjectNode, "9c702ee2-6943-4cba-97c8-ac4cf9549cd2") 61 public: 62 virtual BASE_NS::string GetObjectClassName() const = 0; 63 virtual BASE_NS::string GetObjectName() const = 0; 64 virtual ObjectId GetObjectId() const = 0; 65 virtual InstanceId GetInstanceId() const = 0; 66 virtual ISerNode::Ptr GetMembers() const = 0; 67 68 virtual void SetObjectClassName(BASE_NS::string) = 0; 69 virtual void SetObjectName(BASE_NS::string) = 0; 70 virtual void SetObjectId(ObjectId) = 0; 71 virtual void SetInstanceId(InstanceId) = 0; 72 virtual void SetMembers(ISerNode::Ptr) = 0; 73 }; 74 75 /// Serialisation intermediate form array node 76 class IArrayNode : public ISerNode { 77 META_INTERFACE(ISerNode, IArrayNode, "40230896-a813-45df-b342-892d5b80405d") 78 public: 79 virtual BASE_NS::vector<ISerNode::Ptr> GetMembers() const = 0; 80 virtual void AddNode(const ISerNode::Ptr& node) = 0; 81 }; 82 83 struct NamedNode { 84 BASE_NS::string name; 85 ISerNode::Ptr node; 86 }; 87 88 /// Serialisation intermediate form map node 89 class IMapNode : public ISerNode { 90 META_INTERFACE(ISerNode, IMapNode, "2fecfa69-652e-41cc-9724-3145b43a9ec5") 91 public: 92 virtual BASE_NS::vector<NamedNode> GetMembers() const = 0; 93 virtual ISerNode::Ptr FindNode(BASE_NS::string_view name) const = 0; 94 virtual void AddNode(BASE_NS::string_view name, ISerNode::Ptr) = 0; 95 }; 96 97 /// Serialisation intermediate form built-in value node 98 template<typename Type> 99 class IBuiltinValueNode : public ISerNode { 100 META_INTERFACE(ISerNode, IBuiltinValueNode, MakeUid<Type>("SerNodes")) 101 public: 102 virtual Type GetValue() const = 0; 103 virtual void SetValue(const Type& value) = 0; 104 }; 105 106 using IBoolNode = IBuiltinValueNode<bool>; 107 using IDoubleNode = IBuiltinValueNode<double>; 108 using IIntNode = IBuiltinValueNode<int64_t>; 109 using IUIntNode = IBuiltinValueNode<uint64_t>; 110 using IStringNode = IBuiltinValueNode<BASE_NS::string>; 111 using IRefUriNode = IBuiltinValueNode<RefUri>; 112 113 /// Serialisation intermediate form visitor base interface 114 class ISerNodeVisitor : public CORE_NS::IInterface { 115 META_INTERFACE(CORE_NS::IInterface, ISerNodeVisitor, "147d085e-a0c3-480b-ad21-37cb8db0c120") 116 public: 117 virtual void Visit(const IRootNode&) = 0; 118 virtual void Visit(const INilNode&) = 0; 119 virtual void Visit(const IObjectNode&) = 0; 120 virtual void Visit(const IArrayNode&) = 0; 121 virtual void Visit(const IMapNode&) = 0; 122 virtual void Visit(const IBoolNode&) = 0; 123 virtual void Visit(const IDoubleNode&) = 0; 124 virtual void Visit(const IIntNode&) = 0; 125 virtual void Visit(const IUIntNode&) = 0; 126 virtual void Visit(const IStringNode&) = 0; 127 virtual void Visit(const IRefUriNode&) = 0; 128 virtual void Visit(const ISerNode&) = 0; 129 }; 130 131 META_INTERFACE_TYPE(ISerNode) 132 133 META_END_NAMESPACE() 134 135 #endif 136