The Pedigree Project 0.1
RingQueue.h
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7
8#ifndef PEDIGREE_KERNEL_UTILITIES_RINGQUEUE_H
9#define PEDIGREE_KERNEL_UTILITIES_RINGQUEUE_H
10
11#include "pedigree/kernel/processor/types.h"
12#include "pedigree/kernel/utilities/List.h"
13#include "pedigree/kernel/utilities/assert.h"
14
16template <class T, size_t preallocatedSize = 0>
17class RingQueue {
18 public:
19 explicit RingQueue(size_t capacity) : m_Capacity(capacity) {
20 assert(capacity <= preallocatedSize);
21 }
22
23 size_t count() const {
24 return m_Count;
25 }
26 size_t capacity() const {
27 return m_Capacity;
28 }
29
30 size_t push(const T* items, size_t count) {
31 if (count > m_Capacity - m_Count) {
32 count = m_Capacity - m_Count;
33 }
34 for (size_t i = 0; i < count; ++i) {
35 m_Items[m_Write] = items[i];
36 if (++m_Write == m_Capacity) {
37 m_Write = 0;
38 }
39 }
40 m_Count += count;
41 return count;
42 }
43
44 size_t pop(T* items, size_t count) {
45 if (count > m_Count) {
46 count = m_Count;
47 }
48 for (size_t i = 0; i < count; ++i) {
49 items[i] = m_Items[m_Read];
50 if (++m_Read == m_Capacity) {
51 m_Read = 0;
52 }
53 }
54 m_Count -= count;
55 return count;
56 }
57
58 private:
59 NOT_COPYABLE_OR_ASSIGNABLE(RingQueue);
60
61 const size_t m_Capacity;
62 T m_Items[preallocatedSize] = {};
63 size_t m_Read = 0;
64 size_t m_Write = 0;
65 size_t m_Count = 0;
66};
67
69template <class T>
70class RingQueue<T, 0> {
71 public:
72 explicit RingQueue(size_t capacity) : m_Capacity(capacity) {}
73
74 size_t count() const {
75 return m_Items.count();
76 }
77 size_t capacity() const {
78 return m_Capacity;
79 }
80
81 size_t push(const T* items, size_t count) {
82 if (count > m_Capacity - m_Items.count()) {
83 count = m_Capacity - m_Items.count();
84 }
85 for (size_t i = 0; i < count; ++i) {
86 m_Items.pushBack(items[i]);
87 }
88 return count;
89 }
90
91 size_t pop(T* items, size_t count) {
92 if (count > m_Items.count()) {
93 count = m_Items.count();
94 }
95 for (size_t i = 0; i < count; ++i) {
96 items[i] = m_Items.popFront();
97 }
98 return count;
99 }
100
101 private:
102 NOT_COPYABLE_OR_ASSIGNABLE(RingQueue);
103
104 const size_t m_Capacity;
105 List<T> m_Items;
106};
107
108#endif
Definition List.h:61
#define assert(x)
Definition assert.h:39