summaryrefslogtreecommitdiff
path: root/src/user/include/cxx/structs/alist.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/include/cxx/structs/alist.h')
-rw-r--r--src/user/include/cxx/structs/alist.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/user/include/cxx/structs/alist.h b/src/user/include/cxx/structs/alist.h
new file mode 100644
index 0000000..050f775
--- /dev/null
+++ b/src/user/include/cxx/structs/alist.h
@@ -0,0 +1,41 @@
+#ifndef STRUCTS_ALIST_H
+#define STRUCTS_ALIST_H
+
+#include <knob/format.h>
+#include <knob/block.h>
+#include <knob/panic.h>
+#include <knob/heap.h>
+#include <stdint.h>
+
+template<class data>
+class alist {
+public:
+ uint32_t n_entries;
+ uint32_t buf_size;
+ uint32_t expand_by;
+ data *buf;
+
+ alist(uint32_t default_size=10, uint32_t expand_by=10)
+ : n_entries(0), buf_size(default_size), expand_by(expand_by),
+ buf((data *)get_block(default_size * sizeof(data))) {}
+
+ void add_back(data d) {
+ if (n_entries == buf_size) {
+ data *const new_buf = (data *)get_block((buf_size += expand_by) * sizeof(data));
+ blockcpy(new_buf, buf, n_entries * sizeof(data));
+ free_block(buf);
+ buf = new_buf;
+ }
+ buf[n_entries++] = d;
+ }
+
+ //returns -1 if not found
+ uint32_t index_of(data d) {
+ for (uint32_t i = 0; i < n_entries; ++i)
+ if (buf[i] == d)
+ return i;
+ return -1;
+ }
+};
+
+#endif \ No newline at end of file