/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HOS_BUFFER_ALLOCATOR_FACTORY_H #define HOS_BUFFER_ALLOCATOR_FACTORY_H #include "camera.h" #include "ibuffer_allocator.h" #include #include #include #include namespace OHOS::Camera { #define REGISTER_BUFFER_ALLOCATOR(C, type, ...) \ static BufferAllocatorFactory::BufferAllocatorRegister g_reg##C(type, ##__VA_ARGS__); class BufferAllocatorFactory { public: static BufferAllocatorFactory* GetInstance(); std::shared_ptr GetBufferAllocator(const int32_t type); template class BufferAllocatorRegister { public: template BufferAllocatorRegister(int32_t type, Args... args) { BufferAllocatorFactory* factory = BufferAllocatorFactory::GetInstance(); if (factory != nullptr) { factory->allocatorRegisterMap_.emplace(type, [&args...] { return new C(std::forward(args)...); }); } } }; private: std::shared_ptr CreateBufferAllocator(const int32_t type); private: BufferAllocatorFactory() = default; BufferAllocatorFactory(const BufferAllocatorFactory&); BufferAllocatorFactory& operator=(const BufferAllocatorFactory&); BufferAllocatorFactory(BufferAllocatorFactory&&); BufferAllocatorFactory& operator=(BufferAllocatorFactory&&); ~BufferAllocatorFactory() = default; std::mutex lock_; std::map> bufferAllocatorMap_ = {}; std::map> allocatorRegisterMap_ = {}; }; } // namespace OHOS::Camera #endif