• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_EXT_BASE_OBJECT_H
16 #define META_EXT_BASE_OBJECT_H
17 
18 #include <base/containers/array_view.h>
19 #include <base/containers/vector.h>
20 
21 #include <meta/base/namespace.h>
22 #include <meta/base/types.h>
23 #include <meta/ext/implementation_macros.h>
24 #include <meta/interface/builtin_objects.h>
25 #include <meta/interface/interface_helpers.h>
26 #include <meta/interface/intf_derived.h>
27 #include <meta/interface/intf_lifecycle.h>
28 #include <meta/interface/intf_metadata.h>
29 #include <meta/interface/intf_object.h>
30 #include <meta/interface/intf_object_flags.h>
31 #include <meta/interface/intf_object_registry.h>
32 #include <meta/interface/static_object_metadata.h>
33 
META_BEGIN_NAMESPACE()34 META_BEGIN_NAMESPACE()
35 
36 class BaseObject : public IntroduceInterfaces<IObjectInstance, IObjectFlags, IDerived, ILifecycle, IStaticMetadata> {
37 public:
38     BaseObject() = default;
39     ~BaseObject() override = default;
40 
41     // IObject
42     //    BASE_NS::Uid GetClassId() const override;            //Must be implemented by derived class
43     //    BASE_NS::string_view GetClassName() const override;   //Must be implemented by derived class
44 
45     InstanceId GetInstanceId() const override
46     {
47         return instanceId_;
48     }
49     BASE_NS::string GetName() const override
50     {
51         return GetInstanceId().ToString();
52     }
53     IObject::Ptr Resolve(const RefUri& uri) const override
54     {
55         return GetObjectRegistry().DefaultResolveObject(me_.lock(), uri);
56     }
57 
58     IObject::Ptr GetSelf() const override
59     {
60         return me_.lock();
61     }
62 
63     BASE_NS::vector<BASE_NS::Uid> GetInterfaces() const override
64     {
65         return IntroduceInterfaces::GetInterfacesVector();
66     }
67 
68     ObjectFlagBitsValue GetObjectFlags() const override
69     {
70         return flags_;
71     }
72 
73     void SetObjectFlags(const ObjectFlagBitsValue& value) override
74     {
75         flags_ = value;
76     }
77 
78     ObjectFlagBitsValue GetObjectDefaultFlags() const override
79     {
80         return ObjectFlagBits::DEFAULT_FLAGS;
81     }
82 
83     // IDerived
84     void SetSuperInstance(const IObject::Ptr& aggr, const IObject::Ptr&) override
85     {
86         me_ = interface_pointer_cast<IObjectInstance>(aggr);
87     }
88 
89     // ILifecycle
90     bool Build(const IMetadata::Ptr&) override
91     {
92         flags_ = GetObjectDefaultFlags();
93         return true;
94     }
95     void SetInstanceId(InstanceId uid) override
96     {
97         instanceId_ = uid;
98     }
99     void Destroy() override
100     {
101         GetObjectRegistry().DisposeObject(instanceId_);
102     }
103 
104     template<typename Interface>
105     typename Interface::Ptr GetSelf() const
106     {
107         return interface_pointer_cast<Interface>(GetSelf());
108     }
109 
110     // this allows to use the same macros for base objects too
111     inline static const nullptr_t STATIC_METADATA {};
112     static const StaticObjectMetadata* StaticMetadata()
113     {
114         return nullptr;
115     }
116     const StaticObjectMetadata* GetStaticMetadata() const override
117     {
118         return StaticMetadata();
119     }
120 
121 private:
122     InstanceId instanceId_;
123     IObjectInstance::WeakPtr me_;
124     ObjectFlagBitsValue flags_ { ObjectFlagBits::DEFAULT_FLAGS };
125 };
126 
127 META_END_NAMESPACE()
128 
129 #endif
130