• 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 /// Simple base object implementation that has the most common interfaces for objects
37 class BaseObject : public IntroduceInterfaces<IObjectInstance, IObjectFlags, IDerived, ILifecycle, IStaticMetadata> {
38 public:
39     BaseObject() = default;
40     ~BaseObject() override = default;
41 
42     // IObject
43     //    BASE_NS::Uid GetClassId() const override;            //Must be implemented by derived class
44     //    BASE_NS::string_view GetClassName() const override;   //Must be implemented by derived class
45 
46     InstanceId GetInstanceId() const override
47     {
48         return instanceId_;
49     }
50     BASE_NS::string GetName() const override
51     {
52         return GetInstanceId().ToString();
53     }
54     IObject::Ptr Resolve(const RefUri& uri) const override
55     {
56         return GetObjectRegistry().DefaultResolveObject(me_.lock(), uri);
57     }
58 
59     IObject::Ptr GetSelf() const override
60     {
61         return me_.lock();
62     }
63 
64     BASE_NS::vector<BASE_NS::Uid> GetInterfaces() const override
65     {
66         return IntroduceInterfaces::GetInterfacesVector();
67     }
68 
69     ObjectFlagBitsValue GetObjectFlags() const override
70     {
71         return flags_;
72     }
73 
74     void SetObjectFlags(const ObjectFlagBitsValue& value) override
75     {
76         flags_ = value;
77     }
78 
79     ObjectFlagBitsValue GetObjectDefaultFlags() const override
80     {
81         return ObjectFlagBits::DEFAULT_FLAGS;
82     }
83 
84     // IDerived
85     void SetSuperInstance(const IObject::Ptr& aggr, const IObject::Ptr&) override
86     {
87         me_ = interface_pointer_cast<IObjectInstance>(aggr);
88     }
89 
90     // ILifecycle
91     bool Build(const IMetadata::Ptr&) override
92     {
93         flags_ = GetObjectDefaultFlags();
94         return true;
95     }
96     void SetInstanceId(InstanceId uid) override
97     {
98         instanceId_ = uid;
99     }
100     void Destroy() override
101     {
102         GetObjectRegistry().DisposeObject(instanceId_);
103     }
104 
105     template<typename Interface>
106     typename Interface::Ptr GetSelf() const
107     {
108         return interface_pointer_cast<Interface>(GetSelf());
109     }
110 
111     // this allows to use the same macros for base objects too
112     inline static const nullptr_t STATIC_METADATA {};
113     static const StaticObjectMetadata* StaticMetadata()
114     {
115         return nullptr;
116     }
117     const StaticObjectMetadata* GetStaticMetadata() const override
118     {
119         return StaticMetadata();
120     }
121 
122 private:
123     InstanceId instanceId_;
124     IObjectInstance::WeakPtr me_;
125     ObjectFlagBitsValue flags_ { ObjectFlagBits::DEFAULT_FLAGS };
126 };
127 
128 META_END_NAMESPACE()
129 
130 #endif
131