summaryrefslogtreecommitdiff
path: root/src/user/include/cxx/structs/alist.h
blob: 050f77571858c7deefe7c3d3ce384083bd96fe34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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