CS153/hw6/hw5programs/sp22_tests/hashmap.oat

131 lines
3 KiB
Text
Raw Normal View History

global p = 31;
global size = 32;
global deleted_sp = new HashEntry{key=""; value=""};
global hash_table = new HashEntry?[]{};
struct HashEntry {
string key;
string value
}
int wrap(int i) {
return i [&] (size - 1);
}
int hash_function(string s) {
var arr = array_of_string(s);
var hash = 0;
var poly = 1;
for (var i = 0; i < length(arr); i = i + 1;) {
hash = hash + arr[i] * poly;
poly = poly * p;
}
return wrap(hash);
}
bool string_eq(string s1, string s2) {
var len = length_of_string(s1);
if (len != length_of_string(s2)) {
return false;
}
var arr1 = array_of_string(s1);
var arr2 = array_of_string(s2);
for (var i = 0; i < len; i = i + 1;) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
bool put(string key, string value) {
var hash = hash_function(key);
for (var probe = 0; probe < size; probe = probe + 1;) {
var cur = wrap(hash + probe);
if? (HashEntry sc = hash_table[cur]) {
if (sc == deleted_sp | string_eq(sc.key, key)) {
hash_table[cur] = new HashEntry{key=key; value=value};
return true;
}
} else {
hash_table[cur] = new HashEntry{key=key; value=value};
return true;
}
}
return false;
}
string? get(string key) {
var hash = hash_function(key);
for (var probe = 0; probe < size; probe = probe + 1;) {
var cur = wrap(hash + probe);
if? (HashEntry sc = hash_table[cur]) {
if (sc != deleted_sp & string_eq(sc.key, key)) {
return sc.value;
}
} else {
return string null;
}
}
return string null;
}
bool remove(string key) {
var hash = hash_function(key);
for (var probe = 0; probe < size; probe = probe + 1;) {
var cur = wrap(hash + probe);
if? (HashEntry sc = hash_table[cur]) {
if (sc != deleted_sp & string_eq(sc.key, key)) {
hash_table[cur] = deleted_sp;
return true;
}
} else {
return false;
}
}
return false;
}
int program (int argc, string[] argv) {
hash_table = new HashEntry?[size];
if (!put("course", "cis341")) {
return 1;
}
if (!put("student", "munyam & hanbang")) {
return 1;
}
if?(string s = get("student")) {
if (!string_eq(s, "munyam & hanbang")) {
return 1;
}
} else {
return 1;
}
if?(string s = get("course")) {
if (!string_eq(s, "cis341")) {
return 1;
}
} else {
return 1;
}
if?(string s = get("prof")) {
return 1;
}
if (remove("prof")) {
return 1;
}
if (!remove("course")) {
return 1;
}
if?(string s = get("course")) {
return 1;
}
if?(string s = get("student")) {
if (!string_eq(s, "munyam & hanbang")) {
return 1;
}
} else {
return 1;
}
return 0;
}