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