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.h63
1 files changed, 55 insertions, 8 deletions
diff --git a/src/user/include/cxx/structs/alist.h b/src/user/include/cxx/structs/alist.h
index 050f775..13a24c4 100644
--- a/src/user/include/cxx/structs/alist.h
+++ b/src/user/include/cxx/structs/alist.h
@@ -15,20 +15,67 @@ public:
uint32_t expand_by;
data *buf;
- alist(uint32_t default_size=10, uint32_t expand_by=10)
+ 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))) {}
+ buf(new data[default_size]) {}
+
+ //from is copied
+ alist(const data *from, uint32_t count, uint32_t extra_size = 10, uint32_t expand_by = 10)
+ : n_entries(count), buf_size(count + extra_size), expand_by(expand_by),
+ buf(new data[count + extra_size]) {
+ for (uint32_t i = 0; i < count; ++i)
+ buf[i] = from[i];
+ }
+
+ ~alist() {
+ delete[] buf;
+ }
+
+ void copy_from(const data *from, uint32_t count) {
+ expand_to(count);
+ n_entries = count;
+ for (uint32_t i = 0; i < count; ++i)
+ buf[i] = from[i];
+ }
+
+ void expand_to(uint32_t size) {
+ if (size <= buf_size)
+ return;
+ data *const new_buf = new data[size * sizeof(data)];
+ for (uint32_t i = 0; i < buf_size; ++i)
+ new_buf[i] = buf[i];
+ delete[] buf;
+ buf = new_buf;
+ buf_size = size;
+ }
+
+ void copy_from(const alist<data> &other) {
+ expand_to(n_entries = other.n_entries);
+ for (uint32_t i = 0; i < n_entries; ++i)
+ buf[i] = other.buf[i];
+ }
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;
- }
+ if (n_entries == buf_size)
+ expand_to(buf_size + expand_by);
buf[n_entries++] = d;
}
+ void insert(uint32_t i, data d) {
+ if (n_entries == buf_size)
+ expand_to(buf_size + expand_by);
+ for (uint32_t n = n_entries; n > i; --n)
+ buf[n] = buf[n - 1];
+ buf[i] = d;
+ ++n_entries;
+ }
+
+ void remove(uint32_t i) {
+ --n_entries;
+ for (uint32_t n = i; n < n_entries; ++n)
+ buf[n] = buf[n + 1];
+ }
+
//returns -1 if not found
uint32_t index_of(data d) {
for (uint32_t i = 0; i < n_entries; ++i)