GL CHOCO ENGINE
Loading...
Searching...
No Matches
ring_queue.h File Reference

ジェネリック型のリングキューモジュールを提供する More...

#include <stdbool.h>
#include <stddef.h>
Include dependency graph for ring_queue.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef struct ring_queue ring_queue_t
 ring_queue_t前方宣言
 

Enumerations

enum  ring_queue_result_t {
  RING_QUEUE_SUCCESS = 0 , RING_QUEUE_INVALID_ARGUMENT , RING_QUEUE_NO_MEMORY , RING_QUEUE_RUNTIME_ERROR ,
  RING_QUEUE_UNDEFINED_ERROR , RING_QUEUE_LIMIT_EXCEEDED , RING_QUEUE_DATA_CORRUPTED , RING_QUEUE_OVERFLOW ,
  RING_QUEUE_EMPTY
}
 リングキューAPI実行結果コードリスト More...
 

Functions

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_で初期化する
 
void ring_queue_destroy (ring_queue_t **ring_queue_)
 ring_queue_が管理しているメモリと自身のメモリを解放し、*ring_queue_=NULLにする
 
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する
 
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する
 
bool ring_queue_empty (const ring_queue_t *ring_queue_)
 リングキューが空かを判定する
 

Detailed Description

ジェネリック型のリングキューモジュールを提供する

Author
chocolate-pie24
Note
ring_queue_t構造体は、内部データを隠蔽している。 このため、ring_queue_t型で変数を宣言することはできない。 使用の際は、ring_queue_t*型で宣言すること
ring_queue_tに格納できるデータには、下記の制約を設ける。この制約を設けることにより、バッファが満杯になった時の処理を簡便化することができる。
  • memory_systemのメモリアロケーションで取得するメモリは、全てmax_align_tでアライメントされていること
  • 格納するデータのアライメント要件は2のべき乗であること
  • 格納するデータのアライメント要件はmax_align_t以下であること
ring_queue_tはジェネリック型のデータを格納可能であるが、複数のデータ型を混在して格納することはできない
Version
0.1
Date
2025-10-14
License
MIT License. See LICENSE file in the project root for full license text.

Typedef Documentation

◆ ring_queue_t

typedef struct ring_queue ring_queue_t

ring_queue_t前方宣言

Enumeration Type Documentation

◆ ring_queue_result_t

リングキューAPI実行結果コードリスト

Enumerator
RING_QUEUE_SUCCESS 

処理成功

RING_QUEUE_INVALID_ARGUMENT 

無効な引数

RING_QUEUE_NO_MEMORY 

メモリ不足

RING_QUEUE_RUNTIME_ERROR 

実行時エラー

RING_QUEUE_UNDEFINED_ERROR 

未定義エラー

RING_QUEUE_LIMIT_EXCEEDED 

システム使用可能範囲上限超過

RING_QUEUE_DATA_CORRUPTED 

内部データ破損

RING_QUEUE_OVERFLOW 

計算過程のオーバーフロー

RING_QUEUE_EMPTY 

リングキューが空

Function Documentation

◆ ring_queue_create()

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_で初期化する

Note
初期化されたリングキューに格納するデータのサイズとアライメント要件はelement_size_,element_align_で固定化される

使用例:

// int型のデータを格納するリングキュー初期化処理(格納要素数は8)
ret = ring_queue_create(8, sizeof(int), alignof(int), &ring_queue);
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()

void ring_queue_destroy ( ring_queue_t **  ring_queue_)

ring_queue_が管理しているメモリと自身のメモリを解放し、*ring_queue_=NULLにする

Warning
内部データが破損している場合にはmemory_poolの破棄は行わず、メモリリークとなる
Note
  • 2重デストロイ許可
  • ring_queue_ == NULLの場合はno-op
  • *ring_queue_ == NULLの場合はno-op

使用例:

// int型のデータを格納するリングキュー初期化処理(格納要素数は8)
ret = ring_queue_create(8, sizeof(int), alignof(int), &ring_queue);
ring_queue_destroy(&ring_queue); // ring_queue = NULLになる
ring_queue_destroy(&ring_queue); // 2重デストロイ許可
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()

bool ring_queue_empty ( const ring_queue_t ring_queue_)

リングキューが空かを判定する

Note
  • 引数で与えたring_queue_がNULLの場合は何もせず、true(=空)を返す

使用例:

// int型のデータを格納するリングキュー初期化処理(格納要素数は8)
ret = ring_queue_create(8, sizeof(int), alignof(int), &ring_queue);
bool empty = false;
empty = ring_queue_empty(ring_queue); // empty == true
int a = 10;
ret = ring_queue_push(ring_queue, &a, sizeof(int), alignof(int));
empty = ring_queue_empty(ring_queue); // empty == false
int b = 0;
ret = ring_queue_pop(ring_queue, &b, sizeof(int), alignof(int)); // b = 10になる
empty = ring_queue_empty(ring_queue); // empty == true
ring_queue_destroy(&ring_queue); // ring_queue = NULLになる
ring_queue_destroy(&ring_queue); // 2重デストロイ許可
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
ring_queue_判定対象リングキュー
Returns
true リングキューが空
false リングキューが空ではない

◆ ring_queue_pop()

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する

使用例:

// int型のデータを格納するリングキュー初期化処理(格納要素数は8)
ret = ring_queue_create(8, sizeof(int), alignof(int), &ring_queue);
int a = 10;
ret = ring_queue_push(ring_queue, &a, sizeof(int), alignof(int));
int b = 0;
ret = ring_queue_pop(ring_queue, &b, sizeof(int), alignof(int)); // b = 10になる
ring_queue_destroy(&ring_queue); // ring_queue = NULLになる
ring_queue_destroy(&ring_queue); // 2重デストロイ許可
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_EMPTYring_queueが空
RING_QUEUE_SUCCESSデータの取得に成功し、正常終了

◆ ring_queue_push()

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する

Note
キューが満杯だった場合は以下の動作となる、
  • ワーニングメッセージを出力する(DEBUG_BUILD,TEST_BUILD時のみ)
  • 最古のデータを捨てて新しいデータを格納する(返り値はRING_QUEUE_SUCCESS)

使用例:

// int型のデータを格納するリングキュー初期化処理(格納要素数は8)
ret = ring_queue_create(8, sizeof(int), alignof(int), &ring_queue);
int a = 0;
ret = ring_queue_push(ring_queue, &a, sizeof(int), alignof(int));
ring_queue_destroy(&ring_queue); // ring_queue = NULLになる
ring_queue_destroy(&ring_queue); // 2重デストロイ許可
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データの格納に成功し、正常終了(キューが満杯で古いデータを捨てて新しいデータを格納した場合でも成功となる)