aboutsummaryrefslogtreecommitdiff
path: root/kscurses/queue.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2023-08-17 20:28:47 +0100
committerdam <dam@gudinoff>2023-08-17 20:28:47 +0100
commit709879ee56d31fe543a0ad882713bd4e3d17d2d2 (patch)
tree12a35282bdd0f1f8a2159ade147944c89254db24 /kscurses/queue.jai
parentfa1b8ea54646f1a0f3eadef33e3a660b875cc1ff (diff)
downloadtask-time-tracker-709879ee56d31fe543a0ad882713bd4e3d17d2d2.tar.zst
task-time-tracker-709879ee56d31fe543a0ad882713bd4e3d17d2d2.zip
Added kscurses and testing program.
Diffstat (limited to 'kscurses/queue.jai')
-rw-r--r--kscurses/queue.jai57
1 files changed, 57 insertions, 0 deletions
diff --git a/kscurses/queue.jai b/kscurses/queue.jai
new file mode 100644
index 0000000..86f5dc8
--- /dev/null
+++ b/kscurses/queue.jai
@@ -0,0 +1,57 @@
+Queue :: struct(Element_Type : Type) {
+ buffer : []Element_Type;
+ begin, count := 0;
+}
+pop :: (using queue : *Queue($Element_Type)) -> Element_Type, bool {
+ elem : Element_Type;
+ ok := true;
+ if count {
+ elem = buffer[begin];
+ begin += 1;
+ count -= 1;
+ } else {
+ ok = false;
+ }
+ return elem, ok;
+}
+get_space :: (using queue : *Queue($Element_Type), new_elements_count : int) {
+ if begin + count + new_elements_count <= buffer.count return;
+ if count <= begin && count + new_elements_count <= buffer.count {
+ memcpy(buffer.data, buffer.data + begin, size_of(Element_Type) * count);
+ begin = 0;
+ } else {
+ new_buf := NewArray(count + max(new_elements_count, count), Element_Type);
+ memcpy(new_buf.data, buffer.data + begin, count * size_of(Element_Type));
+ begin = 0;
+ array_free(buffer);
+ buffer = new_buf;
+ }
+}
+push :: (using queue : *Queue($Element_Type), element : Element_Type) {
+ get_space(queue, 1);
+ assert(begin + count + 1 <= buffer.count);
+ buffer[begin + count] = element;
+ count += 1;
+}
+deinit :: (using queue : *Queue($Element_Type)) {
+ array_free(buffer);
+ <<queue = .{};
+}
+for_expansion :: (queue : Queue, body : Code, flags : For_Flags) #expand {
+ for i : 0..queue.count-1 {
+ `it_index := i;
+ `it := queue.buffer[begin + i];
+
+ #insert body;
+ }
+}
+first :: (queue : Queue($Element_Type)) -> Element_Type, bool {
+ result : Element_Type;
+ if queue.count > 0 then result = queue.buffer[queue.begin];
+ return result, queue.count > 0;
+}
+last :: (using queue : Queue($Element_Type)) -> Element_Type, bool {
+ result : Element_Type;
+ if queue.count > 0 then result = queue.buffer[queue.begin + queue.count - 1];
+ return result, queue.count > 0;
+}