-// MANAGED HEAP ALLOCATOR
-typedef struct bh_managed_heap {
- ptr* pointers; // Actually a bh_arr
-} bh_managed_heap;
-
-void bh_managed_heap_init(bh_managed_heap* mh);
-void bh_managed_heap_free(bh_managed_heap* mh);
-bh_allocator bh_managed_heap_allocator(bh_managed_heap* mh);
-BH_ALLOCATOR_PROC(bh_managed_heap_allocator_proc);
-
// ARENA ALLOCATOR
+// MANAGED HEAP ALLOCATOR
+typedef struct bh_managed_heap {
+ bh_imap ptrs;
+} bh_managed_heap;
+
+void bh_managed_heap_init(bh_managed_heap* mh);
+void bh_managed_heap_free(bh_managed_heap* mh);
+bh_allocator bh_managed_heap_allocator(bh_managed_heap* mh);
+BH_ALLOCATOR_PROC(bh_managed_heap_allocator_proc);
+
// MANAGED HEAP ALLOCATOR IMPLEMENTATION
void bh_managed_heap_init(bh_managed_heap* mh) {
- mh->pointers = NULL;
-
- bh_arr_new(bh_heap_allocator(), mh->pointers, 4);
+ bh_imap_init(&mh->ptrs, bh_heap_allocator(), 512);
}
void bh_managed_heap_free(bh_managed_heap* mh) {
- bh_arr_each(ptr, p, mh->pointers) {
- free(*p);
+ bh_arr_each(bh__imap_entry, p, mh->ptrs.entries) {
+ free((void *) p->key);
}
- bh_arr_free(mh->pointers);
+ bh_imap_free(&mh->ptrs);
}
bh_allocator bh_managed_heap_allocator(bh_managed_heap* mh) {
}
if (retval != NULL)
- bh_arr_push(mh->pointers, retval);
+ bh_imap_put(&mh->ptrs, (u64) retval, 1);
} break;
case bh_allocator_action_resize: {
- i32 replace_idx = 0;
- b32 found = 0;
-
- bh_arr_each(ptr, p, mh->pointers) {
- if (*p == prev_memory) {
- found = 1;
- break;
- }
-
- replace_idx++;
- }
-
+ bh_imap_delete(&mh->ptrs, (u64) prev_memory);
retval = realloc(prev_memory, size);
- mh->pointers[replace_idx] = retval;
+ bh_imap_put(&mh->ptrs, (u64) retval, 1);
} break;
case bh_allocator_action_free: {
- i32 free_idx = 0;
- b32 found = 0;
-
- bh_arr_each(ptr, p, mh->pointers) {
- if (*p == prev_memory) {
- found = 1;
- break;
- }
-
- free_idx++;
- }
-
- bh_arr_fastdelete(mh->pointers, free_idx);
+ bh_imap_delete(&mh->ptrs, (u64) prev_memory);
free(prev_memory);
} break;
}
}
#endif
-static b32 token_lit(OnyxTokenizer* tokenizer, OnyxToken* tk, char* lit, b32 is_word, TokenType type) {
- i64 len = chars_match(tokenizer->curr, lit);
- if (len > 0) {
- if (is_word && char_is_alphanum(*(tokenizer->curr + len)) || charset_contains("_$", *(tokenizer->curr + len)))
- return 0;
+#define char_is_alphanum(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9'))
- tk->type = type;
- tk->text = tokenizer->curr;
- tk->length = len;
- tk->pos.line = tokenizer->line_number;
- tk->pos.column = (i32)(tokenizer->curr - tokenizer->line_start) + 1;
+static inline b32 token_lit(OnyxTokenizer* tokenizer, OnyxToken* tk, char* lit, b32 is_word, TokenType type) {
+ i64 len = 0;
+ char* ptr1 = tokenizer->curr;
+ char* ptr2 = lit;
+ while (*ptr2 != '\0' && *ptr1 == *ptr2) ptr1++, ptr2++, len++;
+ if (*ptr2 != '\0') return 0;
- tokenizer->curr += len;
+ if (is_word && char_is_alphanum(*ptr1) || *ptr1 == '_' || *ptr1 == '$')
+ return 0;
- return 1;
- }
- return 0;
+ tk->type = type;
+ tk->text = tokenizer->curr;
+ tk->length = len;
+ tk->pos.line = tokenizer->line_number;
+ tk->pos.column = (i32)(tokenizer->curr - tokenizer->line_start) + 1;
+
+ tokenizer->curr += len;
+
+ return 1;
}
const char* token_name(TokenType tkn_type) {
goto token_parsed;
}
- LITERAL_TOKEN("package", 1, Token_Type_Keyword_Package);
- LITERAL_TOKEN("struct", 1, Token_Type_Keyword_Struct);
- LITERAL_TOKEN("enum" , 1, Token_Type_Keyword_Enum);
- LITERAL_TOKEN("use", 1, Token_Type_Keyword_Use);
- LITERAL_TOKEN("if", 1, Token_Type_Keyword_If);
- LITERAL_TOKEN("elseif", 1, Token_Type_Keyword_Elseif);
- LITERAL_TOKEN("else", 1, Token_Type_Keyword_Else);
- LITERAL_TOKEN("global", 1, Token_Type_Keyword_Global);
- LITERAL_TOKEN("return", 1, Token_Type_Keyword_Return);
- LITERAL_TOKEN("proc", 1, Token_Type_Keyword_Proc);
- LITERAL_TOKEN("as", 1, Token_Type_Keyword_As);
- LITERAL_TOKEN("cast", 1, Token_Type_Keyword_Cast);
- LITERAL_TOKEN("while", 1, Token_Type_Keyword_While);
- LITERAL_TOKEN("for", 1, Token_Type_Keyword_For);
- LITERAL_TOKEN("break", 1, Token_Type_Keyword_Break);
- LITERAL_TOKEN("continue", 1, Token_Type_Keyword_Continue);
- LITERAL_TOKEN("sizeof", 1, Token_Type_Keyword_Sizeof);
- LITERAL_TOKEN("alignof", 1, Token_Type_Keyword_Alignof);
- LITERAL_TOKEN("defer", 1, Token_Type_Keyword_Defer);
- LITERAL_TOKEN("do", 1, Token_Type_Keyword_Do);
- LITERAL_TOKEN("true", 1, Token_Type_Literal_True);
- LITERAL_TOKEN("false", 1, Token_Type_Literal_False);
- LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow);
- LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow);
- LITERAL_TOKEN("---", 0, Token_Type_Empty_Block);
- LITERAL_TOKEN("|>", 0, Token_Type_Pipe);
- LITERAL_TOKEN("&&", 0, Token_Type_And_And);
- LITERAL_TOKEN("||", 0, Token_Type_Or_Or);
- LITERAL_TOKEN(">>>=", 0, Token_Type_Sar_Equal);
- LITERAL_TOKEN(">>=", 0, Token_Type_Shr_Equal);
- LITERAL_TOKEN("<<=", 0, Token_Type_Shl_Equal);
- LITERAL_TOKEN(">>>", 0, Token_Type_Shift_Arith_Right);
- LITERAL_TOKEN(">>", 0, Token_Type_Shift_Right);
- LITERAL_TOKEN("<<", 0, Token_Type_Shift_Left);
- LITERAL_TOKEN("&=", 0, Token_Type_And_Equal);
- LITERAL_TOKEN("|=", 0, Token_Type_Or_Equal);
- LITERAL_TOKEN("^=", 0, Token_Type_Xor_Equal);
- LITERAL_TOKEN("<=", 0, Token_Type_Less_Equal);
- LITERAL_TOKEN(">=", 0, Token_Type_Greater_Equal);
- LITERAL_TOKEN("==", 0, Token_Type_Equal_Equal);
- LITERAL_TOKEN("!=", 0, Token_Type_Not_Equal);
- LITERAL_TOKEN("+=", 0, Token_Type_Plus_Equal);
- LITERAL_TOKEN("-=", 0, Token_Type_Minus_Equal);
- LITERAL_TOKEN("*=", 0, Token_Type_Star_Equal);
- LITERAL_TOKEN("/=", 0, Token_Type_Fslash_Equal);
- LITERAL_TOKEN("%=", 0, Token_Type_Percent_Equal);
-
- // Symbols
- if (char_is_alpha(*tk.text) || *tokenizer->curr == '_') {
- u64 len = 0;
- while (char_is_alphanum(*tokenizer->curr) || charset_contains("_$", *tokenizer->curr)) {
- len++;
- INCREMENT_CURR_TOKEN(tokenizer);
- }
-
- tk.length = len;
- tk.type = Token_Type_Symbol;
- goto token_parsed;
- }
-
// String literal
if (*tk.text == '"') {
u64 len = 0;
goto token_parsed;
}
+ LITERAL_TOKEN("package", 1, Token_Type_Keyword_Package);
+ LITERAL_TOKEN("struct", 1, Token_Type_Keyword_Struct);
+ LITERAL_TOKEN("enum" , 1, Token_Type_Keyword_Enum);
+ LITERAL_TOKEN("use", 1, Token_Type_Keyword_Use);
+ LITERAL_TOKEN("if", 1, Token_Type_Keyword_If);
+ LITERAL_TOKEN("elseif", 1, Token_Type_Keyword_Elseif);
+ LITERAL_TOKEN("else", 1, Token_Type_Keyword_Else);
+ LITERAL_TOKEN("global", 1, Token_Type_Keyword_Global);
+ LITERAL_TOKEN("return", 1, Token_Type_Keyword_Return);
+ LITERAL_TOKEN("proc", 1, Token_Type_Keyword_Proc);
+ LITERAL_TOKEN("as", 1, Token_Type_Keyword_As);
+ LITERAL_TOKEN("cast", 1, Token_Type_Keyword_Cast);
+ LITERAL_TOKEN("while", 1, Token_Type_Keyword_While);
+ LITERAL_TOKEN("for", 1, Token_Type_Keyword_For);
+ LITERAL_TOKEN("break", 1, Token_Type_Keyword_Break);
+ LITERAL_TOKEN("continue", 1, Token_Type_Keyword_Continue);
+ LITERAL_TOKEN("sizeof", 1, Token_Type_Keyword_Sizeof);
+ LITERAL_TOKEN("alignof", 1, Token_Type_Keyword_Alignof);
+ LITERAL_TOKEN("defer", 1, Token_Type_Keyword_Defer);
+ LITERAL_TOKEN("do", 1, Token_Type_Keyword_Do);
+ LITERAL_TOKEN("true", 1, Token_Type_Literal_True);
+ LITERAL_TOKEN("false", 1, Token_Type_Literal_False);
+ LITERAL_TOKEN("->", 0, Token_Type_Right_Arrow);
+ LITERAL_TOKEN("<-", 0, Token_Type_Right_Arrow);
+ LITERAL_TOKEN("---", 0, Token_Type_Empty_Block);
+ LITERAL_TOKEN("|>", 0, Token_Type_Pipe);
+ LITERAL_TOKEN("&&", 0, Token_Type_And_And);
+ LITERAL_TOKEN("||", 0, Token_Type_Or_Or);
+ LITERAL_TOKEN(">>>=", 0, Token_Type_Sar_Equal);
+ LITERAL_TOKEN(">>=", 0, Token_Type_Shr_Equal);
+ LITERAL_TOKEN("<<=", 0, Token_Type_Shl_Equal);
+ LITERAL_TOKEN(">>>", 0, Token_Type_Shift_Arith_Right);
+ LITERAL_TOKEN(">>", 0, Token_Type_Shift_Right);
+ LITERAL_TOKEN("<<", 0, Token_Type_Shift_Left);
+ LITERAL_TOKEN("&=", 0, Token_Type_And_Equal);
+ LITERAL_TOKEN("|=", 0, Token_Type_Or_Equal);
+ LITERAL_TOKEN("^=", 0, Token_Type_Xor_Equal);
+ LITERAL_TOKEN("<=", 0, Token_Type_Less_Equal);
+ LITERAL_TOKEN(">=", 0, Token_Type_Greater_Equal);
+ LITERAL_TOKEN("==", 0, Token_Type_Equal_Equal);
+ LITERAL_TOKEN("!=", 0, Token_Type_Not_Equal);
+ LITERAL_TOKEN("+=", 0, Token_Type_Plus_Equal);
+ LITERAL_TOKEN("-=", 0, Token_Type_Minus_Equal);
+ LITERAL_TOKEN("*=", 0, Token_Type_Star_Equal);
+ LITERAL_TOKEN("/=", 0, Token_Type_Fslash_Equal);
+ LITERAL_TOKEN("%=", 0, Token_Type_Percent_Equal);
+
+ // Symbols
+ if (char_is_alpha(*tk.text) || *tokenizer->curr == '_') {
+ u64 len = 0;
+ while (char_is_alphanum(*tokenizer->curr) || charset_contains("_$", *tokenizer->curr)) {
+ len++;
+ INCREMENT_CURR_TOKEN(tokenizer);
+ }
+
+ tk.length = len;
+ tk.type = Token_Type_Symbol;
+ goto token_parsed;
+ }
+
+
tk.type = (TokenType) *tokenizer->curr;
INCREMENT_CURR_TOKEN(tokenizer);