7ee6a73ea4
Add standard library modules: - Std::String: strlen, strcmp, concat, copy, starts_with wrappers - Std::Map: linear-probing hash map with String keys, int values Add error handling: - Result and Option algebraic enum examples - ? try operator for automatic error propagation in HIR lowering Compiler bugfixes: - Fix sizeof() for user-defined structs (new hSizeOf HIR node) - Fix HIR type lowering for char8, bool8, int8, uint8, etc. - Fix let statement lowering for pointer types (*char8 → int* bug) - Fix PrintInt ABI mismatch (int64_t → int in io.c) - Fix Makefile test bug (_test_tmp_pkg already exists) Documentation: - Rewrite README.md with features, examples, project structure - Add docs/LanguageRef.md — complete language reference - Add docs/Stdlib.md — standard library documentation - Add docs/BuildAndTest.md — build and test guide New examples: strings, map, result_option, try_operator (13 total)
80 lines
1.7 KiB
Plaintext
80 lines
1.7 KiB
Plaintext
module Std::Map {
|
|
|
|
extern func bux_hash_string(s: String) -> uint;
|
|
|
|
struct MapEntry {
|
|
key: String,
|
|
value: int,
|
|
occupied: bool,
|
|
}
|
|
|
|
struct Map {
|
|
entries: *MapEntry,
|
|
cap: uint,
|
|
len: uint,
|
|
}
|
|
|
|
func Map_New(cap: uint) -> Map {
|
|
let total: uint = cap * sizeof(MapEntry);
|
|
let data: *MapEntry = bux_alloc(total) as *MapEntry;
|
|
var i: uint = 0;
|
|
while i < cap {
|
|
data[i].occupied = false;
|
|
i = i + 1;
|
|
}
|
|
return Map { entries: data, cap: cap, len: 0 };
|
|
}
|
|
|
|
func Map_Set(m: *Map, key: String, value: int) {
|
|
let hash: uint = bux_hash_string(key);
|
|
var idx: uint = hash % m.cap;
|
|
while m.entries[idx].occupied {
|
|
if String_Eq(m.entries[idx].key, key) {
|
|
m.entries[idx].value = value;
|
|
return;
|
|
}
|
|
idx = (idx + 1) % m.cap;
|
|
}
|
|
m.entries[idx].key = key;
|
|
m.entries[idx].value = value;
|
|
m.entries[idx].occupied = true;
|
|
m.len = m.len + 1;
|
|
}
|
|
|
|
func Map_Get(m: *Map, key: String) -> int {
|
|
let hash: uint = bux_hash_string(key);
|
|
var idx: uint = hash % m.cap;
|
|
while m.entries[idx].occupied {
|
|
if String_Eq(m.entries[idx].key, key) {
|
|
return m.entries[idx].value;
|
|
}
|
|
idx = (idx + 1) % m.cap;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
func Map_Has(m: *Map, key: String) -> bool {
|
|
let hash: uint = bux_hash_string(key);
|
|
var idx: uint = hash % m.cap;
|
|
while m.entries[idx].occupied {
|
|
if String_Eq(m.entries[idx].key, key) {
|
|
return true;
|
|
}
|
|
idx = (idx + 1) % m.cap;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
func Map_Len(m: *Map) -> uint {
|
|
return m.len;
|
|
}
|
|
|
|
func Map_Free(m: *Map) {
|
|
bux_free(m.entries as *void);
|
|
m.entries = null as *MapEntry;
|
|
m.cap = 0;
|
|
m.len = 0;
|
|
}
|
|
|
|
}
|