summaryrefslogtreecommitdiff
path: root/src/user/include/cxx/structs/map.h
blob: f9c477fa311e84dc255a03a14bf9a834ab652fbc (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
#ifndef STRUCTS_MAP_H
#define STRUCTS_MAP_H

#include <structs/alist.h>

template<class type>
bool default_equals(type a, type b) {
  return a == b;
}

template<class key, class value, bool (*equals)(key, key) = &default_equals<key>>
class map {
public:
  alist<key> keys;
  alist<value> values;

  map(uint32_t default_size=10, uint32_t expand_by=10)
    : keys(default_size, expand_by), values(default_size, expand_by) {}

  void add_pair(key k, value v) {
    for (key *i = keys.buf; i < keys.buf + keys.n_entries; ++i)
      if (equals(k, *i)) {
        values.buf[i - keys.buf] = v;
        return;
      }
    keys.add_back(k);
    values.add_back(v);
  }

  __attribute__ ((pure))
  value transform(key k, value fallback=value()) {
    for (key *i = keys.buf; i < keys.buf + keys.n_entries; ++i)
      if (equals(k, *i))
        return values.buf[i - keys.buf];
    return fallback;
  }
};

#endif