33template <
class T, isize capacity>
struct Array
36 T *elements =
new T[capacity];
47 ~Array() {
delete[] elements; }
49 void clear() { w = 0; }
50 void clear(T t) {
for (isize i = 0; i < capacity; i++) elements[i] = t; clear(); }
51 void align(isize offset) { w = offset; }
58 isize cap()
const {
return capacity; }
59 isize count()
const {
return w; }
60 isize free()
const {
return capacity - w; }
61 double fillLevel()
const {
return (
double)count() / capacity; }
62 bool isEmpty()
const {
return w == 0; }
63 bool isFull()
const {
return count() == capacity; }
70 T operator [] (isize i)
const
75 T& operator [] (isize i)
83 elements[w++] = element;
87template <
class T, isize capacity>
88struct SortedArray :
public Array<T, capacity>
91 i64 *keys =
new i64[capacity];
98 ~SortedArray() {
delete[] keys; }
106 void write(i64 key, T element)
108 assert(!this->isFull());
110 this->elements[this->w] = element;
111 this->keys[this->w] = key;
116 void insert(i64 key, T element)
118 assert(!this->isFull());
122 while (pos && keys[pos - 1] > key) pos--;
125 for (isize i = this->w; i > pos; i--) {
126 this->elements[i] = this->elements[i - 1];
127 keys[i] = keys[i - 1];
131 this->elements[pos] = element;
132 this->keys[pos] = key;
141template <
class T, isize capacity>
struct RingBuffer
144 T *elements =
new T[capacity]();
154 RingBuffer() { clear(); }
155 ~RingBuffer() {
delete[] elements; }
157 void clear() { r = w = 0; }
158 void clear(T t) {
for (isize i = 0; i < capacity; i++) elements[i] = t; clear(); }
159 void align(isize offset) { w = (r + offset) % capacity; }
166 isize cap()
const {
return capacity; }
167 isize count()
const {
return (capacity + w - r) % capacity; }
168 isize free()
const {
return capacity - count() - 1; }
169 double fillLevel()
const {
return (
double)count() / capacity; }
170 bool isEmpty()
const {
return r == w; }
171 bool isFull()
const {
return count() == capacity - 1; }
178 isize begin()
const {
return r; }
179 isize end()
const {
return w; }
180 static isize next(isize i) {
return i < capacity - 1 ? i + 1 : 0; }
181 static isize prev(isize i) {
return i > 0 ? i - 1 : capacity - 1; }
194 return elements[oldr];
197 const T& read(T fallback)
199 if (isEmpty()) write(fallback);
203 void write(T element)
207 elements[w] = element;
218 r = (r + n) % capacity;
226 const T& current()
const
236 const T& current(isize offset)
const
238 return elements[(r + offset) % capacity];
242template <
class T, isize capacity>
243struct SortedRingBuffer :
public RingBuffer<T, capacity>
246 i64 *keys =
new i64[capacity];
253 ~SortedRingBuffer() {
delete[] keys; }
256 void insert(i64 key, T element)
258 assert(!this->isFull());
262 this->write(element);
266 while (oldw != this->r) {
269 auto p = this->prev(oldw);
272 if (key > keys[p])
break;
275 std::swap(this->elements[oldw], this->elements[p]);
276 std::swap(keys[oldw], keys[p]);
282 void append(i64 key, T element)
284 assert(!this->isFull());
285 assert(this->isEmpty() || this->keys[this->prev(this->w)] <= key);
287 this->elements[this->w] = element;
288 this->keys[this->w] = key;
289 this->w = this->next(this->w);