queue
RingBuffer を
目的
末尾 へ追加 し、先頭 から取 り出 す queue API を提供 します。RingBuffer<.T>の所有権 と容量管理 をそのまま利用 しつつ、queue向 けの名前 で公開 します。
実装
内部 にはRingBuffer<.T>を 1個 保持 し、queue helper は対応する ringbuffer helper へ委譲 します。
注意
queue_pushは更新後 のQueue<.T>をResultで返 すため、pipe記法 では|> queue_push ... |> uwokの形 で受 け直 します。queue_pop/queue_peekは空 queue を失敗 ではなくOption::Noneとして返 します。queue_free後 の再利用 は禁止 です。
計算量
len/is_empty/peek/popは O(1) です。pushは償却 O(1)、拡張 発生時 の最悪 時間 計算量 は O(n) です。
Queue
RingBuffer<.T> を
目的
- queue API の
内部状態 を 1値 にまとめ、push / pop後 も同 じ型 で受 け渡 しできるようにします。
注意
rbは所有権 を持 つRingBuffer<.T>です。Queue<.T>はCopy/Clone前提 ではありません。
queue_new
目的
既定 容量 の空 Queue<.T>を作成 します。
実装
ringbuffer_new<.T>を呼 び、成功時 にQueueへ包 み直 します。
注意
確保 失敗 はResult::Err Diagとして返 ります。
計算量
- O(1)
queue_with_capacity
目的
少 なくともcap個 を保持 できる queue を作成 します。
実装
ringbuffer_with_capacity<.T>を呼 び、成功時 にQueueへ包 み直 します。
注意
実際 の容量 は ringbuffer側 の切 り上 げ規則 に従 います。
計算量
- O(1)
queue_len
目的
現在 queue に入 っている要素数 を返 します。
計算量
- O(1)
queue_is_empty
目的
- queue が
空 ならtrue、1要素 でもあればfalseを返 します。
計算量
- O(1)
queue_push
目的
itemを queue の末尾 へ追加 し、更新後 のQueue<.T>を返 します。
実装
RingBufferのpush_backに委譲 し、返 ってきた ringbuffer を新 しいQueueに包 み直 します。
注意
更新後 の queue を受 け取 る API なので、setまたは pipe で束縛 し直 してください。
計算量
償却 O(1)、拡張 発生時 の最悪 時間 計算量 は O(n) です。
queue_pop
目的
先頭 要素 を取 り出 し、空 ならOption::Noneを返 します。
注意
取 り出 し成功時 は queue内部 の先頭位置 が 1要素分 進 みます。
計算量
- O(1)
queue_peek
目的
先頭 要素 を消費 せずに見 たいときに使 います。
注意
空 ならOption::Noneです。
計算量
- O(1)
queue_clear
目的
確保済 み容量 は維持 したまま、要素 だけを空 に戻 します。
計算量
- O(1)
queue_free
目的
- queue が
保持 する ringbuffer header と要素 領域 を解放 します。
注意
free後 の queue を再利用 してはいけません。
計算量
- O(1)