10485dae0Sopenharmony_ci/*
20485dae0Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
30485dae0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40485dae0Sopenharmony_ci * you may not use this file except in compliance with the License.
50485dae0Sopenharmony_ci * You may obtain a copy of the License at
60485dae0Sopenharmony_ci *
70485dae0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
80485dae0Sopenharmony_ci *
90485dae0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100485dae0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110485dae0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120485dae0Sopenharmony_ci * See the License for the specific language governing permissions and
130485dae0Sopenharmony_ci * limitations under the License.
140485dae0Sopenharmony_ci */
150485dae0Sopenharmony_ci
160485dae0Sopenharmony_ci#ifndef QUEUE_H
170485dae0Sopenharmony_ci#define QUEUE_H
180485dae0Sopenharmony_ci
190485dae0Sopenharmony_ci#include <atomic>
200485dae0Sopenharmony_ci
210485dae0Sopenharmony_ci#include "protocol/retcode_inner/aie_retcode_inner.h"
220485dae0Sopenharmony_ci#include "utils/aie_macros.h"
230485dae0Sopenharmony_ci
240485dae0Sopenharmony_cinamespace OHOS {
250485dae0Sopenharmony_cinamespace AI {
260485dae0Sopenharmony_citemplate<class TYPE>
270485dae0Sopenharmony_ciclass Queue {
280485dae0Sopenharmony_ci    FORBID_COPY_AND_ASSIGN(Queue);
290485dae0Sopenharmony_cipublic:
300485dae0Sopenharmony_ci    explicit Queue(size_t maxQueueSize);
310485dae0Sopenharmony_ci
320485dae0Sopenharmony_ci    virtual ~Queue();
330485dae0Sopenharmony_ci
340485dae0Sopenharmony_cipublic:
350485dae0Sopenharmony_ci    /**
360485dae0Sopenharmony_ci     * Check if the queue is empty.
370485dae0Sopenharmony_ci     *
380485dae0Sopenharmony_ci     * @return true if empty or false if not empty.
390485dae0Sopenharmony_ci     */
400485dae0Sopenharmony_ci    bool IsEmpty() const;
410485dae0Sopenharmony_ci
420485dae0Sopenharmony_ci    /**
430485dae0Sopenharmony_ci     * Check if the queue is full.
440485dae0Sopenharmony_ci     *
450485dae0Sopenharmony_ci     * @return true if full or false if not full.
460485dae0Sopenharmony_ci     */
470485dae0Sopenharmony_ci    bool IsFull() const;
480485dae0Sopenharmony_ci
490485dae0Sopenharmony_ci    /**
500485dae0Sopenharmony_ci     * Push a message at the rear.
510485dae0Sopenharmony_ci     *
520485dae0Sopenharmony_ci     * @param [in] msgBlock message to push.
530485dae0Sopenharmony_ci     * @return 1011 if the queue is full or 0 if success.
540485dae0Sopenharmony_ci     */
550485dae0Sopenharmony_ci    int PushBack(TYPE &msgBlock);
560485dae0Sopenharmony_ci
570485dae0Sopenharmony_ci    /**
580485dae0Sopenharmony_ci     * Pop a message from the head.
590485dae0Sopenharmony_ci     *
600485dae0Sopenharmony_ci     * @param [out] msgBlock message from the head.
610485dae0Sopenharmony_ci     * @return 1012 if the queue is empty or 0 if success.
620485dae0Sopenharmony_ci     */
630485dae0Sopenharmony_ci    int PopFront(TYPE &msgBlock);
640485dae0Sopenharmony_ci
650485dae0Sopenharmony_ci    /**
660485dae0Sopenharmony_ci     * Query the number of elements in the queue.
670485dae0Sopenharmony_ci     *
680485dae0Sopenharmony_ci     * @return the number of elements in the queue.
690485dae0Sopenharmony_ci     */
700485dae0Sopenharmony_ci    size_t Count() const;
710485dae0Sopenharmony_ci
720485dae0Sopenharmony_ci    /**
730485dae0Sopenharmony_ci     * Reset the queue.
740485dae0Sopenharmony_ci     */
750485dae0Sopenharmony_ci    void Reset();
760485dae0Sopenharmony_ci
770485dae0Sopenharmony_ciprivate:
780485dae0Sopenharmony_ci    /**
790485dae0Sopenharmony_ci     * Next position to push elements to.
800485dae0Sopenharmony_ci     */
810485dae0Sopenharmony_ci    std::atomic<size_t> pushPos_;
820485dae0Sopenharmony_ci
830485dae0Sopenharmony_ci    /**
840485dae0Sopenharmony_ci     * Next position to pop message from.
850485dae0Sopenharmony_ci     */
860485dae0Sopenharmony_ci    std::atomic<size_t> popPos_;
870485dae0Sopenharmony_ci
880485dae0Sopenharmony_ci    /**
890485dae0Sopenharmony_ci     * Maximum message of the queue.
900485dae0Sopenharmony_ci     */
910485dae0Sopenharmony_ci    size_t totalNum_;
920485dae0Sopenharmony_ci
930485dae0Sopenharmony_ci    /**
940485dae0Sopenharmony_ci     * Writable message number.
950485dae0Sopenharmony_ci     */
960485dae0Sopenharmony_ci    std::atomic<size_t> writeAbleCount_;
970485dae0Sopenharmony_ci
980485dae0Sopenharmony_ci    /**
990485dae0Sopenharmony_ci     * Readable message number.
1000485dae0Sopenharmony_ci     */
1010485dae0Sopenharmony_ci    std::atomic<size_t> readAbleCount_;
1020485dae0Sopenharmony_ci
1030485dae0Sopenharmony_ci    struct QueueNode {
1040485dae0Sopenharmony_ci        bool empty = true;
1050485dae0Sopenharmony_ci        TYPE node;
1060485dae0Sopenharmony_ci    };
1070485dae0Sopenharmony_ci
1080485dae0Sopenharmony_ci    QueueNode *queue_;
1090485dae0Sopenharmony_ci};
1100485dae0Sopenharmony_ci} // namespace AI
1110485dae0Sopenharmony_ci} // namespace OHOS
1120485dae0Sopenharmony_ci
1130485dae0Sopenharmony_ci#include "platform/queuepool/queue.inl"
1140485dae0Sopenharmony_ci
1150485dae0Sopenharmony_ci#endif // QUEUE_H