diff options
| author | dam <dam@gudinoff> | 2023-08-17 20:28:47 +0100 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2023-08-17 20:28:47 +0100 |
| commit | 709879ee56d31fe543a0ad882713bd4e3d17d2d2 (patch) | |
| tree | 12a35282bdd0f1f8a2159ade147944c89254db24 /kscurses/queue.jai | |
| parent | fa1b8ea54646f1a0f3eadef33e3a660b875cc1ff (diff) | |
| download | task-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.jai | 57 |
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; +} |
