#pragma once #include "Mapper.hpp" #include #include namespace cru::ui::mapper { class CRU_UI_API MapperRegistry { public: static MapperRegistry* GetInstance(); MapperRegistry(); CRU_DELETE_COPY(MapperRegistry) CRU_DELETE_MOVE(MapperRegistry) ~MapperRegistry(); const std::vector& GetAllMappers() const { return mapper_list_; } template BasicMapper* GetMapper() const { for (auto mapper : mapper_list_) { if (mapper->GetTypeIndex() == typeid(T)) { return static_cast*>(mapper); } } return nullptr; } template BasicRefMapper* GetRefMapper() const { return GetMapper>(); } template BasicPtrMapper* GetPtrMapper() const { return GetMapper>(); } template std::vector GetMappersByInterface() const { std::vector result; for (auto mapper : mapper_list_) { auto m = dynamic_cast(mapper); if (m) result.push_back(m); } return result; } void RegisterMapper(MapperBase* mapper); void UnregisterMapper(MapperBase* mapper); private: std::vector mapper_list_; }; } // namespace cru::ui::mapper