ジェネリック型のリングキューモジュールの実装
More...
#include <stdalign.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include "engine/containers/ring_queue.h"
#include "engine/core/memory/choco_memory.h"
#include "engine/base/choco_macros.h"
#include "engine/base/choco_message.h"
ジェネリック型のリングキューモジュールの実装
- Author
- chocolate-pie24
- Version
- 0.1
- Date
- 2025-10-14
- Copyright
- Copyright (c) 2025 chocolate-pie24
- License
- MIT License. See LICENSE file in the project root for full license text.
◆ ring_queue_create()
ring_queue_のメモリを確保し、容量max_element_count_で初期化する
- Note
- 初期化されたリングキューに格納するデータのサイズとアライメント要件はelement_size_,element_align_で固定化される
使用例:
ring_queue_result_t ring_queue_create(size_t max_element_count_, size_t element_size_, size_t element_align_, ring_queue_t **ring_queue_)
ring_queue_のメモリを確保し、容量max_element_count_で初期化する
Definition: ring_queue.c:77
ring_queue_result_t
リングキューAPI実行結果コードリスト
Definition: ring_queue.h:50
@ RING_QUEUE_INVALID_ARGUMENT
Definition: ring_queue.h:52
ring_queue_t内部データ構造
Definition: ring_queue.c:39
- Parameters
-
| [in] | max_element_count_ | 要素を格納可能な最大個数 |
| [in] | element_size_ | 格納する要素のサイズ |
| [in] | element_align_ | 格納する要素のアライメント要件(2のべき乗 かつ max_align_t以下でなければいけない) |
| [out] | ring_queue_ | 初期化対象構造体インスタンスへのダブルポインタ |
- Return values
-
| RING_QUEUE_INVALID_ARGUMENT | 以下のいずれか
- ring_queue_ == NULL
- *ring_queue_ != NULL
- 0 == max_element_count_
- 0 == element_size_
- element_align_が2の冪乗ではない
- element_align_がmax_align_tを超過
|
| RING_QUEUE_OVERFLOW | 処理過程でオーバーフローが発生 |
| RING_QUEUE_NO_MEMORY | メモリ不足によりメモリ確保失敗 |
| RING_QUEUE_LIMIT_EXCEEDED | メモリ管理システムのリソースがシステム使用可能範囲上限を超過 |
| RING_QUEUE_SUCCESS | 初期化に成功し、正常終了 |
◆ ring_queue_destroy()
ring_queue_が管理しているメモリと自身のメモリを解放し、*ring_queue_=NULLにする
- Warning
- 内部データが破損している場合にはmemory_poolの破棄は行わず、メモリリークとなる
- Note
- 2重デストロイ許可
- ring_queue_ == NULLの場合はno-op
- *ring_queue_ == NULLの場合はno-op
使用例:
void ring_queue_destroy(ring_queue_t **ring_queue_)
ring_queue_が管理しているメモリと自身のメモリを解放し、*ring_queue_=NULLにする
Definition: ring_queue.c:174
- Parameters
-
| ring_queue_ | メモリ破棄対象構造体インスタンスへのダブルポインタ |
◆ ring_queue_empty()
リングキューが空かを判定する
- Note
- 引数で与えたring_queue_がNULLの場合は何もせず、true(=空)を返す
使用例:
bool empty = false;
int a = 10;
int b = 0;
ring_queue_result_t ring_queue_push(ring_queue_t *ring_queue_, const void *data_, size_t element_size_, size_t element_align_)
ring_queue_にdata_をpushする
Definition: ring_queue.c:196
ring_queue_result_t ring_queue_pop(ring_queue_t *ring_queue_, void *data_, size_t element_size_, size_t element_align_)
ring_queue_からdata_にデータをpopする
Definition: ring_queue.c:231
bool ring_queue_empty(const ring_queue_t *ring_queue_)
リングキューが空かを判定する
Definition: ring_queue.c:269
- Parameters
-
- Returns
- true リングキューが空
-
false リングキューが空ではない
◆ ring_queue_pop()
ring_queue_からdata_にデータをpopする
使用例:
- Parameters
-
| ring_queue_ | データをpopするリングキュー構造体インスタンスへのポインタ |
| data_ | popしたデータの格納先アドレス |
| element_size_ | 格納データサイズ(create時と異なる型ではないかをチェックするため) |
| element_align_ | 格納データアライメント要件(create時と異なる型ではないかをチェックするため) |
- Return values
-
| RING_QUEUE_INVALID_ARGUMENT | 以下のいずれか
- ring_queue_ == NULL
- data_ == NULL
- データ格納キューが未初期化
- element_size_がring_queue_createを実行した時の値と異なる
- element_align_がring_queue_createを実行した時の値と異なる
|
| RING_QUEUE_EMPTY | ring_queueが空 |
| RING_QUEUE_SUCCESS | データの取得に成功し、正常終了 |
◆ ring_queue_push()
ring_queue_にdata_をpushする
- Note
- キューが満杯だった場合は以下の動作となる、
- ワーニングメッセージを出力する(DEBUG_BUILD,TEST_BUILD時のみ)
- 最古のデータを捨てて新しいデータを格納する(返り値はRING_QUEUE_SUCCESS)
使用例:
- Parameters
-
| ring_queue_ | データをpushするリングキュー構造体インスタンスへのポインタ |
| data_ | 格納データへのポインタ |
| element_size_ | 格納データサイズ(create時と異なる型ではないかをチェックするため) |
| element_align_ | 格納データアライメント要件(create時と異なる型ではないかをチェックするため) |
- Return values
-
| RING_QUEUE_INVALID_ARGUMENT | 以下のいずれか
- ring_queue_ == NULL
- data_ == NULL
- データ格納キューが未初期化
- element_size_がring_queue_createを実行した時の値と異なる
- element_align_がring_queue_createを実行した時の値と異なる
|
| RING_QUEUE_SUCCESS | データの格納に成功し、正常終了(キューが満杯で古いデータを捨てて新しいデータを格納した場合でも成功となる) |