1 /*
2  * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef QUEUE_H
17 #define QUEUE_H
18 
19 #include <stdint.h>
20 #include <stdbool.h>
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 typedef struct Queue Queue;
27 typedef void (*NodeDataFreeCb)(void *data);
28 
29 /**
30  * @brief Perform instantiation of the Queue.
31  *
32  * @param capacity Queue's capacity.
33  * @return Succeed return Queue instantiation, failed return NULL.
34  * @since 6
35  */
36 Queue *QueueCreate(uint32_t capacity);
37 
38 /**
39  * @brief Delete instantiation of the Queue.
40  *
41  * @param queue Queue's pointer.
42  * @param cb Free queue node callback.
43  * @since 6
44  */
45 void QueueDelete(Queue *queue, NodeDataFreeCb cb);
46 
47 /**
48  * @brief Enqueue data into Queue.
49  *
50  * @param queue Queue's pointer.
51  * @param data Enqueue data.
52  * @since 6
53  */
54 void QueueEnqueue(Queue *queue, void *data);
55 
56 /**
57  * @brief TryEnqueue data into NonblockQueue.
58  *
59  * @param queue Queue's pointer.
60  * @param data Enqueue data.
61  * @return Success enqueue data return true, else return false.
62  * @since 6
63  */
64 bool QueueTryEnqueue(Queue *queue, void *data);
65 
66 /**
67  * @brief Dequeue data from Queue.
68  * @param queue Queue's pointer.
69  * @return Dequeue data.
70  * @since 6
71  */
72 void *QueueDequeue(Queue *queue);
73 
74 /**
75  * @brief TryDequeue data from NonblockQueue.
76  *
77  * @param queue Queue's pointer.
78  * @return Succeed return data, failed return NULL.
79  * @since 6
80  */
81 void *QueueTryDequeue(Queue *queue);
82 
83 /**
84  * @brief Get Queue EnqueueFd.
85  *
86  * @param queue Queue pointer
87  * @return Succeed return Queue EnqueueFd, failed return -1.
88  * @since 6
89  */
90 int32_t QueueGetEnqueueFd(const Queue *queue);
91 
92 /**
93  * @brief Get Queue DequeueFd.
94  *
95  * @param queue Queue pointer.
96  * @return Succeed return Queue DequeueFd, failed return -1.
97  * @since 6
98  */
99 int32_t QueueGetDequeueFd(const Queue *queue);
100 
101 /**
102  * @brief Flush all data of the queue.
103  *
104  * @param queue Queue pointer.
105  * @param cb Free queue node callback.
106  * @since 6
107  */
108 void QueueFlush(Queue *queue, NodeDataFreeCb cb);
109 
110 /**
111  * @brief Check if the queue is empty.
112  *
113  * @param list Queue pointer.
114  * @return true: The queue is empty. false: The queue is not empty.
115  * @since 6
116  */
117 bool QueueIsEmpty(Queue *queue);
118 
119 /**
120  * @brief Get the size of the queue.
121  *
122  * @param list Queue pointer.
123  * @return The size of the queue.
124  * @since 6
125  */
126 int32_t QueueGetSize(Queue *queue);
127 
128 #ifdef __cplusplus
129 }
130 #endif
131 
132 #endif  // QUEUE_H