195489c19Sopenharmony_ci/* 295489c19Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 395489c19Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 495489c19Sopenharmony_ci * you may not use this file except in compliance with the License. 595489c19Sopenharmony_ci * You may obtain a copy of the License at 695489c19Sopenharmony_ci * 795489c19Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 895489c19Sopenharmony_ci * 995489c19Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1095489c19Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1195489c19Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1295489c19Sopenharmony_ci * See the License for the specific language governing permissions and 1395489c19Sopenharmony_ci * limitations under the License. 1495489c19Sopenharmony_ci */ 1595489c19Sopenharmony_ci 1695489c19Sopenharmony_ci#ifndef BLUETOOTH_OBJECT_MAP_H 1795489c19Sopenharmony_ci#define BLUETOOTH_OBJECT_MAP_H 1895489c19Sopenharmony_ci 1995489c19Sopenharmony_ci#include <functional> 2095489c19Sopenharmony_ci#include <map> 2195489c19Sopenharmony_ci#include <memory> 2295489c19Sopenharmony_ci#include <mutex> 2395489c19Sopenharmony_ci 2495489c19Sopenharmony_ciconstexpr uint32_t MAX_MAP_SIZE = 100; 2595489c19Sopenharmony_citemplate <typename T, int maxSize = MAX_MAP_SIZE> 2695489c19Sopenharmony_ciclass BluetoothObjectMap final { 2795489c19Sopenharmony_cipublic: 2895489c19Sopenharmony_ci BluetoothObjectMap() = default; 2995489c19Sopenharmony_ci ~BluetoothObjectMap() 3095489c19Sopenharmony_ci { 3195489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 3295489c19Sopenharmony_ci objectsMap.clear(); 3395489c19Sopenharmony_ci } 3495489c19Sopenharmony_ci 3595489c19Sopenharmony_ci int AddObject(T object) 3695489c19Sopenharmony_ci { 3795489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 3895489c19Sopenharmony_ci if (objectIncrease > maxSize) { 3995489c19Sopenharmony_ci objectIncrease = 1; 4095489c19Sopenharmony_ci } 4195489c19Sopenharmony_ci objectsMap.insert(std::make_pair(objectIncrease, object)); 4295489c19Sopenharmony_ci return objectIncrease++; 4395489c19Sopenharmony_ci } 4495489c19Sopenharmony_ci 4595489c19Sopenharmony_ci void RemoveObject(int objectId) 4695489c19Sopenharmony_ci { 4795489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 4895489c19Sopenharmony_ci objectsMap.erase(objectId); 4995489c19Sopenharmony_ci } 5095489c19Sopenharmony_ci 5195489c19Sopenharmony_ci void RemoveAllObject(void) 5295489c19Sopenharmony_ci { 5395489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 5495489c19Sopenharmony_ci objectsMap.clear(); 5595489c19Sopenharmony_ci } 5695489c19Sopenharmony_ci 5795489c19Sopenharmony_ci T GetObject(int objectId) 5895489c19Sopenharmony_ci { 5995489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 6095489c19Sopenharmony_ci auto iter = objectsMap.find(objectId); 6195489c19Sopenharmony_ci if (iter == objectsMap.end()) { 6295489c19Sopenharmony_ci return nullptr; 6395489c19Sopenharmony_ci } 6495489c19Sopenharmony_ci return iter->second; 6595489c19Sopenharmony_ci } 6695489c19Sopenharmony_ci 6795489c19Sopenharmony_ci T GetObject() 6895489c19Sopenharmony_ci { 6995489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 7095489c19Sopenharmony_ci for (int i = 1; i < maxSize; i++) { 7195489c19Sopenharmony_ci auto iter = objectsMap.find(i); 7295489c19Sopenharmony_ci if (iter != objectsMap.end()) { 7395489c19Sopenharmony_ci return iter->second; 7495489c19Sopenharmony_ci } 7595489c19Sopenharmony_ci } 7695489c19Sopenharmony_ci return nullptr; 7795489c19Sopenharmony_ci } 7895489c19Sopenharmony_ci 7995489c19Sopenharmony_ci int AddLimitedObject(T object) 8095489c19Sopenharmony_ci { 8195489c19Sopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 8295489c19Sopenharmony_ci int i; 8395489c19Sopenharmony_ci for (i = 1; i < maxSize; i++) { 8495489c19Sopenharmony_ci if (objectsMap.find(i) == objectsMap.end()) { 8595489c19Sopenharmony_ci break; 8695489c19Sopenharmony_ci } 8795489c19Sopenharmony_ci } 8895489c19Sopenharmony_ci if (i == maxSize) { 8995489c19Sopenharmony_ci return -1; 9095489c19Sopenharmony_ci } 9195489c19Sopenharmony_ci objectsMap.insert(std::make_pair(i, object)); 9295489c19Sopenharmony_ci return i; 9395489c19Sopenharmony_ci } 9495489c19Sopenharmony_ci 9595489c19Sopenharmony_ciprivate: 9695489c19Sopenharmony_ci std::mutex lock_; 9795489c19Sopenharmony_ci std::map<int, T> objectsMap; 9895489c19Sopenharmony_ci int objectIncrease = 1; 9995489c19Sopenharmony_ci 10095489c19Sopenharmony_ci BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothObjectMap); 10195489c19Sopenharmony_ci}; 10295489c19Sopenharmony_ci 10395489c19Sopenharmony_ci#endif // BLUETOOTH_OBJECT_MAP_H