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