1 /* 2 * Copyright (c) 2021 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 HOS_CAMERA_CREATE_DEVICEMANAGER_FACTORY_H 17 #define HOS_CAMERA_CREATE_DEVICEMANAGER_FACTORY_H 18 19 #include "idevice_manager.h" 20 #include "device_manager_adapter.h" 21 #include <map> 22 23 namespace OHOS::Camera { 24 typedef std::shared_ptr<IDeviceManager> (*createClass)(void); 25 class CreateDeviceManagerFactory { 26 public: ~CreateDeviceManagerFactory()27 virtual ~CreateDeviceManagerFactory(){}; GetDeviceManagerByName(std::string className)28 std::shared_ptr<IDeviceManager> GetDeviceManagerByName(std::string className) 29 { 30 std::map<std::string, createClass>::const_iterator iter; 31 32 iter = deviceManagerMap_.find(className); 33 if (iter == deviceManagerMap_.end()) { 34 return NULL; 35 } else { 36 return iter->second(); 37 } 38 }; RegistClass(std::string name,createClass method)39 void RegistClass(std::string name, createClass method) 40 { 41 deviceManagerMap_.insert(std::pair<std::string, createClass>(name, method)); 42 }; SharedDeviceManagerFactory()43 static CreateDeviceManagerFactory& SharedDeviceManagerFactory() 44 { 45 static CreateDeviceManagerFactory deviceManagerFactory_; 46 return deviceManagerFactory_; 47 }; 48 49 private: CreateDeviceManagerFactory()50 CreateDeviceManagerFactory(){}; 51 std::map<std::string, createClass> deviceManagerMap_; 52 }; 53 54 class DeviceManagerDynamicClass { 55 public: DeviceManagerDynamicClass(std::string name,createClass method)56 DeviceManagerDynamicClass(std::string name, createClass method) 57 { 58 CreateDeviceManagerFactory::SharedDeviceManagerFactory().RegistClass(name, method); 59 }; ~DeviceManagerDynamicClass()60 ~DeviceManagerDynamicClass() {} 61 }; 62 63 #define DECLARE_DEVICEMANAGER(className) \ 64 private: \ 65 static DeviceManagerDynamicClass* className##_; \ 66 \ 67 public: \ 68 static std::shared_ptr<IDeviceManager> createInstance() \ 69 { \ 70 return std::static_pointer_cast<IDeviceManager>(std::make_shared<className>()); \ 71 } 72 73 #define IMPLEMENT_DEVICEMANAGER(className) \ 74 DeviceManagerDynamicClass* className::className##_ = \ 75 new DeviceManagerDynamicClass(#className, &className::createInstance); 76 77 #define GetDeviceManagerFactory CreateDeviceManagerFactory::SharedDeviceManagerFactory() 78 } // namespace OHOS::Camera 79 #endif 80