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 16 #ifndef META_EXT_OBJECT_CONTAINER_H 17 #define META_EXT_OBJECT_CONTAINER_H 18 19 #include <meta/ext/object.h> 20 #include <meta/interface/interface_macros.h> 21 #include <meta/interface/intf_container.h> 22 #include <meta/interface/intf_required_interfaces.h> 23 24 META_BEGIN_NAMESPACE() 25 26 /** 27 * @brief A helper template class for implementing classes which implement the IContainer interface by 28 * using ClassId::ObjectContainer as their base class. 29 */ 30 template<class FinalClass, const META_NS::ClassInfo& ClassInfo, const META_NS::ClassInfo& SuperClassInfo, 31 class... Interfaces> 32 class CommonObjectContainerFwd : public ObjectFwd<FinalClass, ClassInfo, SuperClassInfo, IContainer, 33 IContainerProxyParent, IRequiredInterfaces, ILockable, IIterable, Interfaces...> { 34 public: 35 using Super = ObjectFwd<FinalClass, ClassInfo, SuperClassInfo, IContainer, IContainerProxyParent, 36 IRequiredInterfaces, ILockable, IIterable, Interfaces...>; 37 38 protected: 39 void SetSuperInstance(const META_NS::IObject::Ptr& aggr, const META_NS::IObject::Ptr& super) override 40 { 41 Super::SetSuperInstance(aggr, super); 42 container_ = interface_cast<IContainer>(super); 43 CORE_ASSERT(container_); 44 } 45 46 protected: // IContainer 47 BASE_NS::vector<IObject::Ptr> GetAll() const override 48 { 49 return container_->GetAll(); 50 } 51 IContainer::SizeType GetSize() const override 52 { 53 return container_->GetSize(); 54 } 55 BASE_NS::vector<IObject::Ptr> FindAll(const IContainer::FindOptions& options) const override 56 { 57 return container_->FindAll(options); 58 } 59 IObject::Ptr FindAny(const IContainer::FindOptions& options) const override 60 { 61 return container_->FindAny(options); 62 } 63 IObject::Ptr FindByName(BASE_NS::string_view name) const override 64 { 65 return container_->FindByName(name); 66 } 67 bool Add(const IObject::Ptr& object) override 68 { 69 return container_->Add(object); 70 } 71 bool Insert(IContainer::SizeType index, const IObject::Ptr& object) override 72 { 73 return container_->Insert(index, object); 74 } 75 using IContainer::GetAt; 76 IObject::Ptr GetAt(IContainer::SizeType index) const override 77 { 78 return container_->GetAt(index); 79 } 80 bool Remove(IContainer::SizeType index) override 81 { 82 return container_->Remove(index); 83 } 84 bool Remove(const IObject::Ptr& child) override 85 { 86 return container_->Remove(child); 87 } 88 bool Replace(const IObject::Ptr& child, const IObject::Ptr& replaceWith, bool addAlways) override 89 { 90 return container_->Replace(child, replaceWith, addAlways); 91 } 92 bool Move(IContainer::SizeType fromIndex, IContainer::SizeType toIndex) override 93 { 94 return container_->Move(fromIndex, toIndex); 95 } 96 bool Move(const IObject::Ptr& child, IContainer::SizeType toIndex) override 97 { 98 return container_->Move(child, toIndex); 99 } 100 void RemoveAll() override 101 { 102 container_->RemoveAll(); 103 } 104 META_FORWARD_EVENT(IOnChildChanged, OnAdded, container_->EventOnAdded()) 105 META_FORWARD_EVENT(IOnChildChanged, OnRemoved, container_->EventOnRemoved()) 106 META_FORWARD_EVENT(IOnChildMoved, OnMoved, container_->EventOnMoved()) 107 108 bool IsAncestorOf(const IObject::ConstPtr& object) const override 109 { 110 return container_->IsAncestorOf(object); 111 } 112 113 protected: // IRequiredInterfaces 114 bool SetRequiredInterfaces(const BASE_NS::vector<TypeId>& interfaces) override 115 { 116 return META_EXT_CALL_BASE(IRequiredInterfaces, SetRequiredInterfaces(interfaces)); 117 } 118 BASE_NS::vector<TypeId> GetRequiredInterfaces() const override 119 { 120 return META_EXT_CALL_BASE(IRequiredInterfaces, GetRequiredInterfaces()); 121 } 122 123 protected: // IContainerProxyParent 124 bool SetProxyParent(const IContainer::Ptr& parent) override 125 { 126 return META_EXT_CALL_BASE(IContainerProxyParent, SetProxyParent(parent)); 127 } 128 129 protected: // ILockable 130 void LockShared() const override 131 { 132 META_EXT_CALL_BASE(ILockable, LockShared()); 133 } 134 void UnlockShared() const override 135 { 136 META_EXT_CALL_BASE(ILockable, UnlockShared()); 137 } 138 void Lock() const override 139 { 140 META_EXT_CALL_BASE(ILockable, Lock()); 141 } 142 void Unlock() const override 143 { 144 META_EXT_CALL_BASE(ILockable, Unlock()); 145 } 146 147 protected: // IIterable 148 IterationResult Iterate(const IterationParameters& params) override 149 { 150 return META_EXT_CALL_BASE(IIterable, Iterate(params)); 151 } 152 IterationResult Iterate(const IterationParameters& params) const override 153 { 154 return META_EXT_CALL_BASE(IIterable, Iterate(params)); 155 } 156 157 private: 158 IContainer* container_ {}; 159 }; 160 161 /** 162 * @brief A helper template class for implementing classes which implement the IContainer interface by 163 * using ClassId::ObjectContainer as their base class. 164 */ 165 template<class FinalClass, const META_NS::ClassInfo& ClassInfo, class... Interfaces> 166 class ObjectContainerFwd 167 : public CommonObjectContainerFwd<FinalClass, ClassInfo, ClassId::ObjectContainer, Interfaces...> {}; 168 169 /** 170 * @brief A helper template class for implementing classes which implement the IContainer interface by 171 * using ClassId::ObjectFlatContainer as their base class. 172 */ 173 template<class FinalClass, const META_NS::ClassInfo& ClassInfo, class... Interfaces> 174 class ObjectFlatContainerFwd 175 : public CommonObjectContainerFwd<FinalClass, ClassInfo, ClassId::ObjectFlatContainer, Interfaces...> {}; 176 177 META_END_NAMESPACE() 178 179 #endif 180