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_CLASS_REGISTRY_H 168bf80f4bSopenharmony_ci#define META_SRC_CLASS_REGISTRY_H 178bf80f4bSopenharmony_ci 188bf80f4bSopenharmony_ci#include <shared_mutex> 198bf80f4bSopenharmony_ci 208bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h> 218bf80f4bSopenharmony_ci 228bf80f4bSopenharmony_ci#include <meta/ext/event_impl.h> 238bf80f4bSopenharmony_ci#include <meta/ext/implementation_macros.h> 248bf80f4bSopenharmony_ci#include <meta/ext/object_factory.h> 258bf80f4bSopenharmony_ci#include <meta/interface/intf_class_registry.h> 268bf80f4bSopenharmony_ci#include <meta/interface/intf_object_factory.h> 278bf80f4bSopenharmony_ci#include <meta/interface/object_type_info.h> 288bf80f4bSopenharmony_ci 298bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 308bf80f4bSopenharmony_ci 318bf80f4bSopenharmony_ci/** If strict=true, return true if all bits from bitmask are set in compareTo. 328bf80f4bSopenharmony_ci * If strict=false, return true if any bits from bitmask are set in compareTo. */ 338bf80f4bSopenharmony_ciconstexpr inline bool CheckCategoryBits(ObjectCategoryBits compareTo, ObjectCategoryBits bitmask, bool strict) 348bf80f4bSopenharmony_ci{ 358bf80f4bSopenharmony_ci return strict ? (compareTo & bitmask) == bitmask : (compareTo & bitmask) != 0; 368bf80f4bSopenharmony_ci} 378bf80f4bSopenharmony_ci 388bf80f4bSopenharmony_ciclass ClassRegistry final : public IntroduceInterfaces<IClassRegistry> { 398bf80f4bSopenharmony_cipublic: 408bf80f4bSopenharmony_ci void Clear(); 418bf80f4bSopenharmony_ci bool Register(const IObjectFactory::Ptr& fac); 428bf80f4bSopenharmony_ci bool Unregister(const IObjectFactory::Ptr& fac); 438bf80f4bSopenharmony_ci 448bf80f4bSopenharmony_ci BASE_NS::string GetClassName(BASE_NS::Uid uid) const; 458bf80f4bSopenharmony_ci IObjectFactory::ConstPtr GetObjectFactory(const BASE_NS::Uid& uid) const; 468bf80f4bSopenharmony_ci BASE_NS::vector<IClassInfo::ConstPtr> GetAllTypes( 478bf80f4bSopenharmony_ci ObjectCategoryBits category, bool strict, bool excludeDeprecated) const; 488bf80f4bSopenharmony_ci 498bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IEvent> EventOnClassRegistered() const override 508bf80f4bSopenharmony_ci { 518bf80f4bSopenharmony_ci return onRegistered_; 528bf80f4bSopenharmony_ci } 538bf80f4bSopenharmony_ci BASE_NS::shared_ptr<IEvent> EventOnClassUnregistered() const override 548bf80f4bSopenharmony_ci { 558bf80f4bSopenharmony_ci return onUnregistered_; 568bf80f4bSopenharmony_ci } 578bf80f4bSopenharmony_ci 588bf80f4bSopenharmony_cipublic: // IClassRegistry 598bf80f4bSopenharmony_ci BASE_NS::vector<IClassInfo::ConstPtr> GetAllTypes( 608bf80f4bSopenharmony_ci const BASE_NS::vector<BASE_NS::Uid>& interfaceUids, bool strict, bool excludeDeprecated) const override; 618bf80f4bSopenharmony_ci 628bf80f4bSopenharmony_ciprivate: 638bf80f4bSopenharmony_ci mutable std::shared_mutex mutex_; 648bf80f4bSopenharmony_ci mutable BASE_NS::unordered_map<ObjectId, IObjectFactory::Ptr> objectFactories_; 658bf80f4bSopenharmony_ci 668bf80f4bSopenharmony_ci mutable BASE_NS::shared_ptr<EventImpl<IOnClassRegistrationChanged>> onRegistered_ { 678bf80f4bSopenharmony_ci CreateShared<EventImpl<IOnClassRegistrationChanged>>("OnClassRegistered") 688bf80f4bSopenharmony_ci }; 698bf80f4bSopenharmony_ci mutable BASE_NS::shared_ptr<EventImpl<IOnClassRegistrationChanged>> onUnregistered_ { 708bf80f4bSopenharmony_ci CreateShared<EventImpl<IOnClassRegistrationChanged>>("OnClassRegistered") 718bf80f4bSopenharmony_ci }; 728bf80f4bSopenharmony_ci}; 738bf80f4bSopenharmony_ci 748bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 758bf80f4bSopenharmony_ci 768bf80f4bSopenharmony_ci#endif // META_SRC_CLASS_REGISTRY_H 77