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#ifndef META_SRC_METADATA_H
16#define META_SRC_METADATA_H
17
18#include <base/containers/array_view.h>
19#include <base/containers/vector.h>
20
21#include <meta/base/types.h>
22#include <meta/ext/implementation_macros.h>
23#include <meta/interface/interface_helpers.h>
24#include <meta/interface/intf_container.h>
25#include <meta/interface/intf_metadata.h>
26
27#include "container/flat_container.h"
28
29META_BEGIN_NAMESPACE()
30
31namespace Internal {
32
33class Metadata : public IntroduceInterfaces<IMetadata> {
34public:
35    Metadata();
36    Metadata(const IMetadata& data);
37    ~Metadata() override = default;
38
39    IMetadata::Ptr CloneMetadata() const override;
40
41protected:
42    IContainer::Ptr GetPropertyContainer() override;
43    IContainer::ConstPtr GetPropertyContainer() const override;
44
45    void AddFunction(const IFunction::Ptr&) override;
46    void RemoveFunction(const IFunction::Ptr&) override;
47
48    void AddProperty(const IProperty::Ptr&) override;
49    void RemoveProperty(const IProperty::Ptr&) override;
50
51    void AddEvent(const IEvent::Ptr&) override;
52    void RemoveEvent(const IEvent::Ptr&) override;
53
54    void SetProperties(const BASE_NS::vector<IProperty::Ptr>&) override;
55
56    void Merge(const IMetadata::Ptr&) override;
57
58    BASE_NS::vector<IProperty::Ptr> GetAllProperties() override;
59    BASE_NS::vector<IProperty::ConstPtr> GetAllProperties() const override;
60    BASE_NS::vector<IFunction::Ptr> GetAllFunctions() override;
61    BASE_NS::vector<IFunction::ConstPtr> GetAllFunctions() const override;
62    BASE_NS::vector<IEvent::Ptr> GetAllEvents() override;
63    BASE_NS::vector<IEvent::ConstPtr> GetAllEvents() const override;
64
65    IProperty::Ptr GetPropertyByName(BASE_NS::string_view name) override;
66    IProperty::ConstPtr GetPropertyByName(BASE_NS::string_view name) const override;
67    IFunction::Ptr GetFunctionByName(BASE_NS::string_view name) override;
68    IFunction::ConstPtr GetFunctionByName(BASE_NS::string_view name) const override;
69    IEvent::ConstPtr GetEventByName(BASE_NS::string_view name) const override;
70    IEvent::Ptr GetEventByName(BASE_NS::string_view name) override;
71
72private:
73    BASE_NS::shared_ptr<class MetadataPropertyContainer> propertyContainer_;
74    IContainer::Ptr properties_;
75    BASE_NS::vector<IFunction::Ptr> functionMetadata_;
76    BASE_NS::vector<IEvent::Ptr> eventMetadata_;
77};
78
79class MetadataPropertyContainer
80    : public IntroduceInterfaces<IObject, IContainer, IRequiredInterfaces, IContainerPreTransaction, IIterable> {
81public:
82    MetadataPropertyContainer();
83    ~MetadataPropertyContainer() override = default;
84    META_NO_COPY_MOVE(MetadataPropertyContainer);
85
86    BASE_NS::vector<IObject::Ptr> GetAll() const override;
87    IObject::Ptr GetAt(SizeType index) const override;
88    SizeType GetSize() const override;
89    BASE_NS::vector<IObject::Ptr> FindAll(const FindOptions& options) const override;
90    IObject::Ptr FindAny(const FindOptions& options) const override;
91    IObject::Ptr FindByName(BASE_NS::string_view name) const override;
92    bool Add(const IObject::Ptr& object) override;
93    bool Insert(SizeType index, const IObject::Ptr& object) override;
94    bool Remove(SizeType index) override;
95    bool Remove(const IObject::Ptr& child) override;
96    bool Move(SizeType fromIndex, SizeType toIndex) override;
97    bool Move(const IObject::Ptr& child, SizeType toIndex) override;
98    bool Replace(const IObject::Ptr& child, const IObject::Ptr& replaceWith, bool addAlways) override;
99    void RemoveAll() override;
100    bool SetRequiredInterfaces(const BASE_NS::vector<TypeId>& interfaces) override;
101    bool IsAncestorOf(const IObject::ConstPtr& object) const override;
102    BASE_NS::vector<TypeId> GetRequiredInterfaces() const override;
103    BASE_NS::shared_ptr<IEvent> EventOnAdded() const override;
104    BASE_NS::shared_ptr<IEvent> EventOnRemoved() const override;
105    BASE_NS::shared_ptr<IEvent> EventOnMoved() const override;
106    BASE_NS::shared_ptr<IEvent> EventOnAdding() const override;
107    BASE_NS::shared_ptr<IEvent> EventOnRemoving() const override;
108    IterationResult Iterate(const IterationParameters& params) override;
109    IterationResult Iterate(const IterationParameters& params) const override;
110
111    ObjectId GetClassId() const override
112    {
113        return {};
114    }
115    BASE_NS::string_view GetClassName() const override
116    {
117        return "MetadataPropertyContainer";
118    }
119    BASE_NS::string GetName() const override
120    {
121        return "";
122    }
123    BASE_NS::vector<BASE_NS::Uid> GetInterfaces() const override
124    {
125        return GetInterfacesVector();
126    }
127
128private:
129    FlatContainer impl_;
130    mutable BASE_NS::shared_ptr<EventImpl<IOnChildChanged>> onAdded_ { CreateShared<EventImpl<IOnChildChanged>>(
131        "OnAdded") };
132    mutable BASE_NS::shared_ptr<EventImpl<IOnChildChanged>> onRemoved_ { CreateShared<EventImpl<IOnChildChanged>>(
133        "OnRemoved") };
134    mutable BASE_NS::shared_ptr<EventImpl<IOnChildMoved>> onMoved_ { CreateShared<EventImpl<IOnChildMoved>>(
135        "OnMoved") };
136    mutable BASE_NS::shared_ptr<EventImpl<IOnChildChanging>> onAdding_ { CreateShared<EventImpl<IOnChildChanging>>(
137        "OnAdding") };
138    mutable BASE_NS::shared_ptr<EventImpl<IOnChildChanging>> onRemoving_ { CreateShared<EventImpl<IOnChildChanging>>(
139        "OnRemoving") };
140};
141
142} // namespace Internal
143
144META_END_NAMESPACE()
145#endif
146