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