import vector import io fun map(): map { var toRet.construct(): map return toRet } fun map(key:T, value:U): map { var toRet.construct(): map toRet.set(key, value) return toRet } obj map (Object) { var keys: vector::vector var values: vector::vector fun construct() { keys.construct() values.construct() } fun copy_construct(old: *map) { keys.copy_construct(&old->keys) values.copy_construct(&old->values) } fun operator=(rhs: map) { destruct() copy_construct(&rhs) } fun destruct() { keys.destruct() values.destruct() } fun operator[]=(key: T, value: U) { set(key,value) } fun set(key: T, value: U) { var keyIdx = keys.find(key) if (keyIdx >= 0) { values.set(keyIdx, value) return; } keys.add(key) values.add(value) } fun contains_key(key: T): bool { return keys.contains(key) } fun get(key: T): ref U { return values.get(keys.find(key)) } fun remove(key: T) { var idx = keys.find(key) if (idx < 0) { io::println("trying to remove nonexistant key-value!") return; } keys.remove(idx) values.remove(idx) } fun clear() { keys.clear() values.clear() } fun operator[](key: T): ref U { return get(key) } fun for_each(func: fun(T, U):void) { for (var i = 0; i < keys.size; i++;) func(keys[i], values[i]) } }