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 CORE__ECS_HELPER__COMPONENT_TOOLS__BASE_MANAGER_H
168bf80f4bSopenharmony_ci#define CORE__ECS_HELPER__COMPONENT_TOOLS__BASE_MANAGER_H
178bf80f4bSopenharmony_ci
188bf80f4bSopenharmony_ci#include <atomic>
198bf80f4bSopenharmony_ci#include <cstddef>
208bf80f4bSopenharmony_ci#include <cstdint>
218bf80f4bSopenharmony_ci
228bf80f4bSopenharmony_ci#include <base/containers/array_view.h>
238bf80f4bSopenharmony_ci#include <base/containers/string_view.h>
248bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h>
258bf80f4bSopenharmony_ci#include <base/containers/vector.h>
268bf80f4bSopenharmony_ci#include <base/namespace.h>
278bf80f4bSopenharmony_ci#include <base/util/uid.h>
288bf80f4bSopenharmony_ci#include <core/ecs/entity.h>
298bf80f4bSopenharmony_ci#include <core/ecs/intf_component_manager.h>
308bf80f4bSopenharmony_ci#include <core/namespace.h>
318bf80f4bSopenharmony_ci#include <core/property/intf_property_api.h>
328bf80f4bSopenharmony_ci#include <core/property/intf_property_handle.h>
338bf80f4bSopenharmony_ci#include <core/property/scoped_handle.h>
348bf80f4bSopenharmony_ci
358bf80f4bSopenharmony_ciCORE_BEGIN_NAMESPACE()
368bf80f4bSopenharmony_ciclass IEcs;
378bf80f4bSopenharmony_cistruct Property;
388bf80f4bSopenharmony_ci
398bf80f4bSopenharmony_ci// BaseClass should inherit IComponentManager AND should follow the basic form of component managers
408bf80f4bSopenharmony_ci// (this will be enforced later)
418bf80f4bSopenharmony_citemplate<typename ComponentType, typename BaseClass>
428bf80f4bSopenharmony_ciclass BaseManager : public BaseClass, public IPropertyApi {
438bf80f4bSopenharmony_ci    using ComponentId = IComponentManager::ComponentId;
448bf80f4bSopenharmony_ci
458bf80f4bSopenharmony_cipublic:
468bf80f4bSopenharmony_ci    // IPropertyApi
478bf80f4bSopenharmony_ci    size_t PropertyCount() const override = 0;
488bf80f4bSopenharmony_ci    const Property* MetaData(size_t index) const override = 0;
498bf80f4bSopenharmony_ci    BASE_NS::array_view<const Property> MetaData() const override = 0;
508bf80f4bSopenharmony_ci    IPropertyHandle* Create() const override;
518bf80f4bSopenharmony_ci    IPropertyHandle* Clone(const IPropertyHandle*) const override;
528bf80f4bSopenharmony_ci    void Release(IPropertyHandle*) const override;
538bf80f4bSopenharmony_ci    uint64_t Type() const override;
548bf80f4bSopenharmony_ci
558bf80f4bSopenharmony_ci    // IComponentManager
568bf80f4bSopenharmony_ci    BASE_NS::string_view GetName() const override;
578bf80f4bSopenharmony_ci    BASE_NS::Uid GetUid() const override;
588bf80f4bSopenharmony_ci    size_t GetComponentCount() const override;
598bf80f4bSopenharmony_ci    const IPropertyApi& GetPropertyApi() const override;
608bf80f4bSopenharmony_ci    Entity GetEntity(ComponentId index) const override;
618bf80f4bSopenharmony_ci    uint32_t GetComponentGeneration(ComponentId index) const override;
628bf80f4bSopenharmony_ci    bool HasComponent(Entity entity) const override;
638bf80f4bSopenharmony_ci    IComponentManager::ComponentId GetComponentId(Entity entity) const override;
648bf80f4bSopenharmony_ci    void Create(Entity entity) override;
658bf80f4bSopenharmony_ci    bool Destroy(Entity entity) override;
668bf80f4bSopenharmony_ci    void Gc() override;
678bf80f4bSopenharmony_ci    void Destroy(BASE_NS::array_view<const Entity> gcList) override;
688bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> GetAddedComponents() override;
698bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> GetRemovedComponents() override;
708bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> GetUpdatedComponents() override;
718bf80f4bSopenharmony_ci    CORE_NS::ComponentManagerModifiedFlags GetModifiedFlags() const override;
728bf80f4bSopenharmony_ci    void ClearModifiedFlags() override;
738bf80f4bSopenharmony_ci    uint32_t GetGenerationCounter() const override;
748bf80f4bSopenharmony_ci    void SetData(Entity entity, const IPropertyHandle& dataHandle) override;
758bf80f4bSopenharmony_ci    const IPropertyHandle* GetData(Entity entity) const override;
768bf80f4bSopenharmony_ci    IPropertyHandle* GetData(Entity entity) override;
778bf80f4bSopenharmony_ci    void SetData(ComponentId index, const IPropertyHandle& dataHandle) override;
788bf80f4bSopenharmony_ci    const IPropertyHandle* GetData(ComponentId index) const override;
798bf80f4bSopenharmony_ci    IPropertyHandle* GetData(ComponentId index) override;
808bf80f4bSopenharmony_ci    IEcs& GetEcs() const override;
818bf80f4bSopenharmony_ci
828bf80f4bSopenharmony_ci    // "base class"
838bf80f4bSopenharmony_ci    ComponentType Get(ComponentId index) const override;
848bf80f4bSopenharmony_ci    ComponentType Get(Entity entity) const override;
858bf80f4bSopenharmony_ci    void Set(ComponentId index, const ComponentType& aData) override;
868bf80f4bSopenharmony_ci    void Set(Entity entity, const ComponentType& aData) override;
878bf80f4bSopenharmony_ci    ScopedHandle<const ComponentType> Read(ComponentId index) const override;
888bf80f4bSopenharmony_ci    ScopedHandle<const ComponentType> Read(Entity entity) const override;
898bf80f4bSopenharmony_ci    ScopedHandle<ComponentType> Write(ComponentId index) override;
908bf80f4bSopenharmony_ci    ScopedHandle<ComponentType> Write(Entity entity) override;
918bf80f4bSopenharmony_ci
928bf80f4bSopenharmony_ci    // internal, non-public
938bf80f4bSopenharmony_ci    void Updated(Entity entity);
948bf80f4bSopenharmony_ci
958bf80f4bSopenharmony_ci    BaseManager(const BaseManager&) = delete;
968bf80f4bSopenharmony_ci    BaseManager(BaseManager&&) = delete;
978bf80f4bSopenharmony_ci    BaseManager& operator=(const BaseManager&) = delete;
988bf80f4bSopenharmony_ci    BaseManager& operator=(BaseManager&&) = delete;
998bf80f4bSopenharmony_ci
1008bf80f4bSopenharmony_ciprotected:
1018bf80f4bSopenharmony_ci    BaseManager(IEcs& ecs, BASE_NS::string_view) noexcept;
1028bf80f4bSopenharmony_ci    virtual ~BaseManager();
1038bf80f4bSopenharmony_ci    IEcs& ecs_;
1048bf80f4bSopenharmony_ci    BASE_NS::string_view name_;
1058bf80f4bSopenharmony_ci
1068bf80f4bSopenharmony_ci    bool IsMatchingHandle(const IPropertyHandle& handle);
1078bf80f4bSopenharmony_ci
1088bf80f4bSopenharmony_ci    class BaseComponentHandle : public IPropertyHandle {
1098bf80f4bSopenharmony_ci    public:
1108bf80f4bSopenharmony_ci        BaseComponentHandle() = delete;
1118bf80f4bSopenharmony_ci        BaseComponentHandle(BaseManager* owner, Entity entity) noexcept;
1128bf80f4bSopenharmony_ci        BaseComponentHandle(BaseManager* owner, Entity entity, const ComponentType& data) noexcept;
1138bf80f4bSopenharmony_ci        ~BaseComponentHandle() override = default;
1148bf80f4bSopenharmony_ci        BaseComponentHandle(const BaseComponentHandle& other) = delete;
1158bf80f4bSopenharmony_ci        BaseComponentHandle(BaseComponentHandle&& other) noexcept;
1168bf80f4bSopenharmony_ci        BaseComponentHandle& operator=(const BaseComponentHandle& other) = delete;
1178bf80f4bSopenharmony_ci        BaseComponentHandle& operator=(BaseComponentHandle&& other) noexcept;
1188bf80f4bSopenharmony_ci        const IPropertyApi* Owner() const override;
1198bf80f4bSopenharmony_ci        size_t Size() const override;
1208bf80f4bSopenharmony_ci        const void* RLock() const override;
1218bf80f4bSopenharmony_ci        void RUnlock() const override;
1228bf80f4bSopenharmony_ci        void* WLock() override;
1238bf80f4bSopenharmony_ci        void WUnlock() override;
1248bf80f4bSopenharmony_ci
1258bf80f4bSopenharmony_ci        mutable std::atomic_uint32_t rLocked_ { 0 };
1268bf80f4bSopenharmony_ci        mutable bool wLocked_ { false };
1278bf80f4bSopenharmony_ci        bool dirty_ { false };
1288bf80f4bSopenharmony_ci        BaseManager* manager_ { nullptr };
1298bf80f4bSopenharmony_ci        uint32_t generation_ { 0 };
1308bf80f4bSopenharmony_ci        Entity entity_;
1318bf80f4bSopenharmony_ci        ComponentType data_;
1328bf80f4bSopenharmony_ci    };
1338bf80f4bSopenharmony_ci    uint32_t generationCounter_ { 0 };
1348bf80f4bSopenharmony_ci    uint32_t modifiedFlags_ { 0 };
1358bf80f4bSopenharmony_ci    BASE_NS::unordered_map<Entity, ComponentId> entityComponent_;
1368bf80f4bSopenharmony_ci    BASE_NS::vector<BaseComponentHandle> components_;
1378bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> added_;
1388bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> removed_;
1398bf80f4bSopenharmony_ci    BASE_NS::vector<Entity> updated_;
1408bf80f4bSopenharmony_ci    uint64_t typeHash_;
1418bf80f4bSopenharmony_ci};
1428bf80f4bSopenharmony_ciCORE_END_NAMESPACE()
1438bf80f4bSopenharmony_ci#endif
144