summaryrefslogtreecommitdiff
path: root/Source/Library/Common/Map.class.h
blob: 1270752baeabdb21d8edbf56fb77a4eb62509ec5 (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
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef DEF_MAP_CLASS_H
#define DEF_MAP_CLASS_H

template <typename K, typename V>
class Map {
	private:
	V m_null;
	struct item_t {
		item_t *prev, *next;
		K key;
		V value;
		item_t(const K& _key, const V& _value) : prev(0), next(0), key(_key), value(_value) {}
		~item_t() {
			if (prev != 0) delete prev;
			if (next != 0) delete next;
		}
	} *m_root;

	//Recursive functions for internal use
	item_t* find(const K& key, item_t* start) {
		if (start == 0) return 0;
		if (start->key == key) return start;
		if (start->key > key) return find(key, start->prev);
		if (start->key < key) return find(key, start->next);
		return 0;
	}
	item_t* insert(const K& key, const V& value, item_t* start) {
		if (start == 0) return new item_t(key, value);
		if (start->key == key) return 0;
		if (start->key > key) {
			start->prev = insert(key, value, start->prev);
			return start;
		}
		if (start->key < key) {
			start->next = insert(key, value, start->next);
			return start;
		}
		return 0;
	}

	public:
	Map();
	~Map();

	bool has(const K& key);
	void set(const K& key, const V& value);
	const V& get(const K& key);
	V& operator[] (const K& key);
};

#include "Map.class.cpp"

#endif