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#ifndef META_SRC_BASE_OBJECT_H
168bf80f4bSopenharmony_ci#define META_SRC_BASE_OBJECT_H
178bf80f4bSopenharmony_ci
188bf80f4bSopenharmony_ci#include <base/containers/array_view.h>
198bf80f4bSopenharmony_ci#include <base/containers/vector.h>
208bf80f4bSopenharmony_ci
218bf80f4bSopenharmony_ci#include <meta/base/types.h>
228bf80f4bSopenharmony_ci#include <meta/ext/implementation_macros.h>
238bf80f4bSopenharmony_ci#include <meta/ext/metadata_helpers.h>
248bf80f4bSopenharmony_ci#include <meta/ext/object_factory.h>
258bf80f4bSopenharmony_ci#include <meta/interface/builtin_objects.h>
268bf80f4bSopenharmony_ci#include <meta/interface/interface_helpers.h>
278bf80f4bSopenharmony_ci#include <meta/interface/intf_derived.h>
288bf80f4bSopenharmony_ci#include <meta/interface/intf_lifecycle.h>
298bf80f4bSopenharmony_ci#include <meta/interface/intf_object.h>
308bf80f4bSopenharmony_ci#include <meta/interface/intf_object_flags.h>
318bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h>
328bf80f4bSopenharmony_ci#include <meta/interface/object_type_info.h>
338bf80f4bSopenharmony_ci
348bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
358bf80f4bSopenharmony_ci
368bf80f4bSopenharmony_cinamespace Internal {
378bf80f4bSopenharmony_ci
388bf80f4bSopenharmony_ciclass BaseObject : public IntroduceInterfaces<IObjectInstance, IObjectFlags, IDerived, ILifecycle> {
398bf80f4bSopenharmony_ciprotected:
408bf80f4bSopenharmony_ci    BaseObject() = default;
418bf80f4bSopenharmony_ci    ~BaseObject() override = default;
428bf80f4bSopenharmony_ci
438bf80f4bSopenharmony_ci    // IObject
448bf80f4bSopenharmony_ci    //    BASE_NS::Uid GetClassId() const override;            //Must be implemented by derived class
458bf80f4bSopenharmony_ci    //    BASE_NS::string_view GetClassName() const override;   //Must be implemented by derived class
468bf80f4bSopenharmony_ci    InstanceId GetInstanceId() const override;
478bf80f4bSopenharmony_ci    BASE_NS::string GetName() const override;
488bf80f4bSopenharmony_ci    IObject::Ptr Resolve(const RefUri& uri) const override;
498bf80f4bSopenharmony_ci    IObject::Ptr GetSelf() const override;
508bf80f4bSopenharmony_ci    BASE_NS::vector<BASE_NS::Uid> GetInterfaces() const override;
518bf80f4bSopenharmony_ci    // IObjectFlags
528bf80f4bSopenharmony_ci    ObjectFlagBitsValue GetObjectFlags() const override;
538bf80f4bSopenharmony_ci    void SetObjectFlags(const ObjectFlagBitsValue& value) override;
548bf80f4bSopenharmony_ci    ObjectFlagBitsValue GetObjectDefaultFlags() const override;
558bf80f4bSopenharmony_ci
568bf80f4bSopenharmony_ci    template<typename Interface>
578bf80f4bSopenharmony_ci    typename Interface::Ptr GetSelf() const
588bf80f4bSopenharmony_ci    {
598bf80f4bSopenharmony_ci        return interface_pointer_cast<Interface>(GetSelf());
608bf80f4bSopenharmony_ci    }
618bf80f4bSopenharmony_ci
628bf80f4bSopenharmony_ci    // IDerived
638bf80f4bSopenharmony_ci    void SetSuperInstance(const IObject::Ptr&, const IObject::Ptr&) override;
648bf80f4bSopenharmony_ci    BASE_NS::Uid GetSuperClassUid() const override;
658bf80f4bSopenharmony_ci
668bf80f4bSopenharmony_ci    // ILifecycle
678bf80f4bSopenharmony_ci    bool Build(const IMetadata::Ptr& data) override;
688bf80f4bSopenharmony_ci    void SetInstanceId(InstanceId uid) override;
698bf80f4bSopenharmony_ci    void Destroy() override;
708bf80f4bSopenharmony_ci
718bf80f4bSopenharmony_ciprotected:
728bf80f4bSopenharmony_ci    IObjectRegistry& GetObjectRegistry() const;
738bf80f4bSopenharmony_ci
748bf80f4bSopenharmony_ciprotected:
758bf80f4bSopenharmony_ci    static StaticObjectMetadata& StaticObjectMeta()
768bf80f4bSopenharmony_ci    {
778bf80f4bSopenharmony_ci        static StaticObjectMetadata meta { META_NS::ClassId::BaseObject, nullptr };
788bf80f4bSopenharmony_ci        return meta;
798bf80f4bSopenharmony_ci    }
808bf80f4bSopenharmony_ci
818bf80f4bSopenharmony_cipublic:
828bf80f4bSopenharmony_ci    static const META_NS::StaticObjectMetadata& GetStaticObjectMetadata()
838bf80f4bSopenharmony_ci    {
848bf80f4bSopenharmony_ci        return StaticObjectMeta();
858bf80f4bSopenharmony_ci    }
868bf80f4bSopenharmony_ci
878bf80f4bSopenharmony_ciprivate:
888bf80f4bSopenharmony_ci    InstanceId instanceId_;
898bf80f4bSopenharmony_ci    IObjectInstance::WeakPtr me_;
908bf80f4bSopenharmony_ci    ObjectFlagBitsValue flags_ { ObjectFlagBits::DEFAULT_FLAGS };
918bf80f4bSopenharmony_ci};
928bf80f4bSopenharmony_ci
938bf80f4bSopenharmony_citemplate<class FinalClass, const META_NS::ClassInfo& ClassInfo, class ConcreteBaseClass, class... Interfaces>
948bf80f4bSopenharmony_ciclass ConcreteBaseFwd : public IntroduceInterfaces<Interfaces...>, public ConcreteBaseClass {
958bf80f4bSopenharmony_ci    STATIC_METADATA_MACHINERY(ClassInfo, ConcreteBaseClass)
968bf80f4bSopenharmony_ci    STATIC_INTERFACES_WITH_CONCRETE_BASE(IntroduceInterfaces<Interfaces...>, ConcreteBaseClass)
978bf80f4bSopenharmony_ci    META_DEFINE_OBJECT_TYPE_INFO(FinalClass, ClassInfo)
988bf80f4bSopenharmony_cipublic:
998bf80f4bSopenharmony_ci    using ConcreteBaseClass::GetInterfacesVector;
1008bf80f4bSopenharmony_ci
1018bf80f4bSopenharmony_ciprotected:
1028bf80f4bSopenharmony_ci    ObjectId GetClassId() const override
1038bf80f4bSopenharmony_ci    {
1048bf80f4bSopenharmony_ci        return ClassInfo.Id();
1058bf80f4bSopenharmony_ci    }
1068bf80f4bSopenharmony_ci    BASE_NS::string_view GetClassName() const override
1078bf80f4bSopenharmony_ci    {
1088bf80f4bSopenharmony_ci        return ClassInfo.Name();
1098bf80f4bSopenharmony_ci    }
1108bf80f4bSopenharmony_ci    BASE_NS::vector<BASE_NS::Uid> GetInterfaces() const override
1118bf80f4bSopenharmony_ci    {
1128bf80f4bSopenharmony_ci        return GetStaticInterfaces();
1138bf80f4bSopenharmony_ci    }
1148bf80f4bSopenharmony_ci
1158bf80f4bSopenharmony_cipublic:
1168bf80f4bSopenharmony_ci    const CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) const override
1178bf80f4bSopenharmony_ci    {
1188bf80f4bSopenharmony_ci        auto* me = const_cast<ConcreteBaseFwd*>(this);
1198bf80f4bSopenharmony_ci        return me->ConcreteBaseFwd::GetInterface(uid);
1208bf80f4bSopenharmony_ci    }
1218bf80f4bSopenharmony_ci    CORE_NS::IInterface* GetInterface(const BASE_NS::Uid& uid) override
1228bf80f4bSopenharmony_ci    {
1238bf80f4bSopenharmony_ci        CORE_NS::IInterface* ret = ConcreteBaseClass::GetInterface(uid);
1248bf80f4bSopenharmony_ci        if (!ret) {
1258bf80f4bSopenharmony_ci            ret = IntroduceInterfaces<Interfaces...>::GetInterface(uid);
1268bf80f4bSopenharmony_ci        }
1278bf80f4bSopenharmony_ci        return ret;
1288bf80f4bSopenharmony_ci    }
1298bf80f4bSopenharmony_ci
1308bf80f4bSopenharmony_ciprotected:
1318bf80f4bSopenharmony_ci    void Ref() override
1328bf80f4bSopenharmony_ci    {
1338bf80f4bSopenharmony_ci        ConcreteBaseClass::Ref();
1348bf80f4bSopenharmony_ci    }
1358bf80f4bSopenharmony_ci    void Unref() override
1368bf80f4bSopenharmony_ci    {
1378bf80f4bSopenharmony_ci        ConcreteBaseClass::Unref();
1388bf80f4bSopenharmony_ci    }
1398bf80f4bSopenharmony_ci};
1408bf80f4bSopenharmony_ci
1418bf80f4bSopenharmony_citemplate<class FinalClass, const META_NS::ClassInfo& ClassInfo, class... Interfaces>
1428bf80f4bSopenharmony_ciclass BaseObjectFwd : public ConcreteBaseFwd<FinalClass, ClassInfo, META_NS::Internal::BaseObject, Interfaces...> {
1438bf80f4bSopenharmony_ci    using Impl = META_NS::Internal::BaseObject;
1448bf80f4bSopenharmony_ci
1458bf80f4bSopenharmony_cipublic:
1468bf80f4bSopenharmony_ci    virtual IObjectRegistry& GetObjectRegistry() const
1478bf80f4bSopenharmony_ci    {
1488bf80f4bSopenharmony_ci        return BaseObject::GetObjectRegistry();
1498bf80f4bSopenharmony_ci    }
1508bf80f4bSopenharmony_ci
1518bf80f4bSopenharmony_ciprotected:
1528bf80f4bSopenharmony_ci    BaseObjectFwd() = default;
1538bf80f4bSopenharmony_ci    ~BaseObjectFwd() override = default;
1548bf80f4bSopenharmony_ci};
1558bf80f4bSopenharmony_ci
1568bf80f4bSopenharmony_ci} // namespace Internal
1578bf80f4bSopenharmony_ci
1588bf80f4bSopenharmony_ciclass BaseObject : public Internal::BaseObjectFwd<BaseObject, META_NS::ClassId::BaseObject> {
1598bf80f4bSopenharmony_ci    using Super = Internal::BaseObjectFwd<BaseObject, META_NS::ClassId::BaseObject>;
1608bf80f4bSopenharmony_ci
1618bf80f4bSopenharmony_cipublic:
1628bf80f4bSopenharmony_ci    using Super::Super;
1638bf80f4bSopenharmony_ci};
1648bf80f4bSopenharmony_ci
1658bf80f4bSopenharmony_ciMETA_END_NAMESPACE()
1668bf80f4bSopenharmony_ci
1678bf80f4bSopenharmony_ci#endif
168