This repository was archived by the owner on Jan 4, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathring_buffer.zig
More file actions
63 lines (45 loc) · 1.64 KB
/
ring_buffer.zig
File metadata and controls
63 lines (45 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const std = @import("std");
const assert = std.debug.assert;
const stdx = @import("stdx");
const RingBuffer = stdx.RingBuffer;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// Create a basic ring buffer
var ring_buffer = try RingBuffer(u64).initCapacity(allocator, 100);
defer ring_buffer.deinit(allocator);
// Enqueue a single item
const first_value: u64 = 10;
try ring_buffer.enqueue(allocator, first_value);
assert(ring_buffer.count == 1);
// Enqueue many items
const values: [3]u64 = [_]u64{9999} ** 3;
try ring_buffer.enqueueSlice(allocator, &values);
// fill the remaining capacity of the ring buffer
ring_buffer.fill(4321);
assert(ring_buffer.available() == 0);
// iterate over all of the items in the ring buffer
var iter = ring_buffer.iterator();
while (iter.next()) |entry| {
const v = entry.*;
// do nothing with this
_ = v;
}
// dequeue a single item from the ring buffer
const v = ring_buffer.dequeue();
assert(first_value == v);
// dequeue many items from the queue
var out: [2]u64 = [_]u64{0} ** 2;
const dequeued_items_count = ring_buffer.dequeueSlice(&out);
assert(dequeued_items_count == out.len);
const new_head_value: u64 = 8601;
assert(ring_buffer.count > 0);
// prepend an item
try ring_buffer.prepend(allocator, new_head_value);
// dequeue the head item
assert(new_head_value == ring_buffer.dequeue().?);
// reset the ring buffer
ring_buffer.reset();
assert(ring_buffer.isEmpty());
}