122736c2fSopenharmony_ci/*
222736c2fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
322736c2fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
422736c2fSopenharmony_ci * you may not use this file except in compliance with the License.
522736c2fSopenharmony_ci * You may obtain a copy of the License at
622736c2fSopenharmony_ci *
722736c2fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
822736c2fSopenharmony_ci *
922736c2fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1022736c2fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1122736c2fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1222736c2fSopenharmony_ci * See the License for the specific language governing permissions and
1322736c2fSopenharmony_ci * limitations under the License.
1422736c2fSopenharmony_ci */
1522736c2fSopenharmony_ci
1622736c2fSopenharmony_ci#ifndef OHOS_INPUTMETHOD_BLOCK_QUEUE_H
1722736c2fSopenharmony_ci#define OHOS_INPUTMETHOD_BLOCK_QUEUE_H
1822736c2fSopenharmony_ci#include <condition_variable>
1922736c2fSopenharmony_ci#include <mutex>
2022736c2fSopenharmony_ci#include <queue>
2122736c2fSopenharmony_ci
2222736c2fSopenharmony_cinamespace OHOS {
2322736c2fSopenharmony_cinamespace MiscServices {
2422736c2fSopenharmony_citemplate<typename T>
2522736c2fSopenharmony_ciclass BlockQueue {
2622736c2fSopenharmony_cipublic:
2722736c2fSopenharmony_ci    explicit BlockQueue(uint32_t timeout) : timeout_(timeout)
2822736c2fSopenharmony_ci    {
2922736c2fSopenharmony_ci    }
3022736c2fSopenharmony_ci
3122736c2fSopenharmony_ci    ~BlockQueue() = default;
3222736c2fSopenharmony_ci
3322736c2fSopenharmony_ci    void Pop()
3422736c2fSopenharmony_ci    {
3522736c2fSopenharmony_ci        std::unique_lock<std::mutex> lock(queuesMutex_);
3622736c2fSopenharmony_ci        queues_.pop();
3722736c2fSopenharmony_ci        cv_.notify_all();
3822736c2fSopenharmony_ci    }
3922736c2fSopenharmony_ci
4022736c2fSopenharmony_ci    void Push(const T &data)
4122736c2fSopenharmony_ci    {
4222736c2fSopenharmony_ci        std::unique_lock<std::mutex> lock(queuesMutex_);
4322736c2fSopenharmony_ci        queues_.push(data);
4422736c2fSopenharmony_ci    }
4522736c2fSopenharmony_ci
4622736c2fSopenharmony_ci    void Wait(const T &data)
4722736c2fSopenharmony_ci    {
4822736c2fSopenharmony_ci        std::unique_lock<std::mutex> lock(queuesMutex_);
4922736c2fSopenharmony_ci        cv_.wait_for(lock, std::chrono::milliseconds(timeout_), [&data, this]() { return data == queues_.front(); });
5022736c2fSopenharmony_ci    }
5122736c2fSopenharmony_ci
5222736c2fSopenharmony_ci    bool IsReady(const T &data)
5322736c2fSopenharmony_ci    {
5422736c2fSopenharmony_ci        std::unique_lock<std::mutex> lock(queuesMutex_);
5522736c2fSopenharmony_ci        return data == queues_.front();
5622736c2fSopenharmony_ci    }
5722736c2fSopenharmony_ci
5822736c2fSopenharmony_ci    bool GetFront(T &data)
5922736c2fSopenharmony_ci    {
6022736c2fSopenharmony_ci        std::unique_lock<std::mutex> lock(queuesMutex_);
6122736c2fSopenharmony_ci        if (queues_.empty()) {
6222736c2fSopenharmony_ci            return false;
6322736c2fSopenharmony_ci        }
6422736c2fSopenharmony_ci        data = queues_.front();
6522736c2fSopenharmony_ci        return true;
6622736c2fSopenharmony_ci    }
6722736c2fSopenharmony_ci
6822736c2fSopenharmony_ciprivate:
6922736c2fSopenharmony_ci    const uint32_t timeout_;
7022736c2fSopenharmony_ci    std::mutex queuesMutex_;
7122736c2fSopenharmony_ci    std::queue<T> queues_;
7222736c2fSopenharmony_ci    std::condition_variable cv_;
7322736c2fSopenharmony_ci};
7422736c2fSopenharmony_ci} // namespace MiscServices
7522736c2fSopenharmony_ci} // namespace OHOS
7622736c2fSopenharmony_ci#endif // OHOS_INPUTMETHOD_BLOCK_QUEUE_H
77