mirror of
https://github.com/Ed94/WATL_Exercise.git
synced 2025-08-04 22:32:43 -07:00
finalize V0
This commit is contained in:
@@ -435,18 +435,17 @@ def_struct(tmpl(KT1L_Slot,type)) { \
|
||||
typedef tmpl(Slice_KT1L_Slot,type) tmpl(KT1L,type)
|
||||
|
||||
typedef Slice_Byte KT1L_Byte;
|
||||
typedef def_struct(KT1L_Info) {
|
||||
AllocatorInfo backing;
|
||||
typedef def_struct(KT1L_Meta) {
|
||||
SSIZE slot_size;
|
||||
SSIZE kt_value_offset;
|
||||
SSIZE type_width;
|
||||
Str8 type_name;
|
||||
};
|
||||
SSIZE kt1l__populate_slice_a2(KT1L_Byte* kt, KT1L_Info info, Slice_Byte values, SSIZE num_values );
|
||||
SSIZE kt1l__populate_slice_a2(KT1L_Byte* kt, AllocatorInfo backing, KT1L_Meta m, Slice_Byte values, SSIZE num_values );
|
||||
#define kt1l_populate_slice_a2(type, kt, ainfo, values) kt1l__populate_slice_a2( \
|
||||
cast(KT1L_Byte*, kt), \
|
||||
(KT1L_Info){ \
|
||||
.backing = ainfo, \
|
||||
ainfo, \
|
||||
(KT1L_Meta){ \
|
||||
.slot_size = size_of(KT1L_Slot_Str8), \
|
||||
.kt_value_offset = offset_of(tmpl(KT1L_Slot,type), value), \
|
||||
.type_width = size_of(type), \
|
||||
@@ -496,9 +495,7 @@ typedef def_struct(KT1CX_ByteMeta) {
|
||||
SSIZE type_width;
|
||||
Str8 type_name;
|
||||
};
|
||||
typedef def_struct(KT1CX_Info) {
|
||||
AllocatorInfo backing_table;
|
||||
AllocatorInfo backing_cells;
|
||||
typedef def_struct(KT1CX_InfoMeta) {
|
||||
SSIZE cell_pool_size;
|
||||
SSIZE table_size;
|
||||
SSIZE slot_size;
|
||||
@@ -509,7 +506,11 @@ typedef def_struct(KT1CX_Info) {
|
||||
SSIZE type_width;
|
||||
Str8 type_name;
|
||||
};
|
||||
void kt1cx__init (KT1CX_Info info, KT1CX_Byte* result);
|
||||
typedef def_struct(KT1CX_Info) {
|
||||
AllocatorInfo backing_table;
|
||||
AllocatorInfo backing_cells;
|
||||
};
|
||||
void kt1cx__init (KT1CX_Info info, KT1CX_InfoMeta m, KT1CX_Byte* result);
|
||||
void kt1cx__clear (KT1CX_Byte kt, KT1CX_ByteMeta meta);
|
||||
U64 kt1cx__slot_id(KT1CX_Byte kt, U64 key, KT1CX_ByteMeta meta);
|
||||
Byte* kt1cx__get (KT1CX_Byte kt, U64 key, KT1CX_ByteMeta meta);
|
||||
@@ -1014,9 +1015,11 @@ typedef def_struct(OS_Windows_State) {
|
||||
};
|
||||
global OS_Windows_State os__windows_info;
|
||||
|
||||
inline
|
||||
OS_SystemInfo* os_system_info(void) {
|
||||
return & os__windows_info.system_info;
|
||||
}
|
||||
inline
|
||||
void os__enable_large_pages(void) {
|
||||
MS_HANDLE token;
|
||||
if (OpenProcessToken(GetCurrentProcess(), MS_TOKEN_ADJUST_PRIVILEGES | MS_TOKEN_QUERY, &token))
|
||||
@@ -1060,6 +1063,7 @@ inline void os_vmem_release(void* vm, SSIZE size) { VirtualFree(vm, 0, MS_MEM_R
|
||||
#pragma endregion OS
|
||||
|
||||
#pragma region VArena (Virutal Address Space Arena)
|
||||
inline
|
||||
VArena* varena__make(Opts_varena_make* opts) {
|
||||
assert(opts != nullptr);
|
||||
if (opts->reserve_size == 0) { opts->reserve_size = mega(64); }
|
||||
@@ -1082,6 +1086,7 @@ VArena* varena__make(Opts_varena_make* opts) {
|
||||
};
|
||||
return vm;
|
||||
}
|
||||
inline
|
||||
Slice_Byte varena__push(VArena* vm, SSIZE amount, SSIZE type_width, Opts_varena* opts) {
|
||||
assert(amount != 0);
|
||||
SSIZE alignment = opts->alignment ? opts->alignment : MEMORY_ALIGNMENT_DEFAULT;
|
||||
@@ -1372,9 +1377,9 @@ void arena_allocator_proc(AllocatorProc_In in, AllocatorProc_Out* out)
|
||||
#pragma endregion Arena
|
||||
|
||||
#pragma region Key Table 1-Layer Linear (KT1L)
|
||||
SSIZE kt1l__populate_slice_a2(KT1L_Byte* kt, KT1L_Info info, Slice_Byte values, SSIZE num_values ) {
|
||||
SSIZE kt1l__populate_slice_a2(KT1L_Byte* kt, AllocatorInfo backing, KT1L_Meta info, Slice_Byte values, SSIZE num_values ) {
|
||||
assert(kt != nullptr);
|
||||
* kt = alloc_slice(info.backing, Byte, info.slot_size * num_values );
|
||||
* kt = alloc_slice(backing, Byte, info.slot_size * num_values );
|
||||
slice_assert(* kt);
|
||||
SSIZE num_bytes = 0;
|
||||
for (range_iter(SSIZE, iter, 0, <, num_values)) {
|
||||
@@ -1397,17 +1402,17 @@ SSIZE kt1l__populate_slice_a2(KT1L_Byte* kt, KT1L_Info info, Slice_Byte values,
|
||||
|
||||
#pragma region Key Table 1-Layer Chained-Chunked_Cells (KT1CX)
|
||||
inline
|
||||
void kt1cx__init(KT1CX_Info info, KT1CX_Byte* result) {
|
||||
void kt1cx__init(KT1CX_Info info, KT1CX_InfoMeta m, KT1CX_Byte* result) {
|
||||
assert(result != nullptr);
|
||||
assert(info.backing_cells.proc != nullptr);
|
||||
assert(info.backing_table.proc != nullptr);
|
||||
assert(info.cell_depth > 0);
|
||||
assert(info.cell_pool_size >= kilo(4));
|
||||
assert(info.table_size >= kilo(4));
|
||||
assert(info.type_width > 0);
|
||||
result->table = mem_alloc(info.backing_table, info.table_size * info.cell_size);
|
||||
result->cell_pool = mem_alloc(info.backing_cells, info.cell_size * info.cell_pool_size);
|
||||
result->table.len = info.table_size; // Setting to the table number of elements instead of byte length.
|
||||
assert(m.cell_depth > 0);
|
||||
assert(m.cell_pool_size >= kilo(4));
|
||||
assert(m.table_size >= kilo(4));
|
||||
assert(m.type_width > 0);
|
||||
result->table = mem_alloc(info.backing_table, m.table_size * m.cell_size);
|
||||
result->cell_pool = mem_alloc(info.backing_cells, m.cell_size * m.cell_pool_size);
|
||||
result->table.len = m.table_size; // Setting to the table number of elements instead of byte length.
|
||||
}
|
||||
void kt1cx__clear(KT1CX_Byte kt, KT1CX_ByteMeta m) {
|
||||
Byte* cursor = kt.table.ptr;
|
||||
@@ -1463,6 +1468,7 @@ Byte* kt1cx__get(KT1CX_Byte kt, U64 key, KT1CX_ByteMeta m) {
|
||||
}
|
||||
}
|
||||
}
|
||||
inline
|
||||
Byte* kt1cx__set(KT1CX_Byte kt, U64 key, Slice_Byte value, AllocatorInfo backing_cells, KT1CX_ByteMeta m) {
|
||||
U64 hash_index = kt1cx__slot_id(kt, key, m);
|
||||
SSIZE cell_offset = hash_index * m.cell_size;
|
||||
@@ -1681,6 +1687,7 @@ Str8 str8__fmt(Str8 fmt_template, Slice_A2_Str8* entries) {
|
||||
Str8 result = str8__fmt_kt1l((AllocatorInfo){0}, slice_fmem(buf_mem), kt, fmt_template);
|
||||
return result;
|
||||
}
|
||||
inline
|
||||
void str8cache__init(Str8Cache* cache, Opts_str8cache_init* opts) {
|
||||
assert(cache != nullptr);
|
||||
assert(opts != nullptr);
|
||||
@@ -1695,6 +1702,8 @@ void str8cache__init(Str8Cache* cache, Opts_str8cache_init* opts) {
|
||||
KT1CX_Info info = {
|
||||
.backing_cells = opts->cell_reserve,
|
||||
.backing_table = opts->tbl_backing,
|
||||
};
|
||||
KT1CX_InfoMeta m = {
|
||||
.cell_pool_size = opts->cell_pool_size,
|
||||
.table_size = opts->table_size,
|
||||
.slot_size = size_of(KT1CX_Slot_Str8),
|
||||
@@ -1705,7 +1714,7 @@ void str8cache__init(Str8Cache* cache, Opts_str8cache_init* opts) {
|
||||
.type_width = size_of(Str8),
|
||||
.type_name = lit(stringify(Str8))
|
||||
};
|
||||
kt1cx__init(info, cast(KT1CX_Byte*, & cache->kt));
|
||||
kt1cx__init(info, m, cast(KT1CX_Byte*, & cache->kt));
|
||||
return;
|
||||
}
|
||||
inline Str8Cache str8cache__make(Opts_str8cache_init* opts) { Str8Cache cache; str8cache__init(& cache, opts); return cache; }
|
||||
@@ -2079,7 +2088,7 @@ void api_watl_lex(WATL_LexInfo* info, Str8 source, Opts_watl_lex* opts)
|
||||
info->toks.ptr = tok - num + 1;
|
||||
info->toks.len = num;
|
||||
}
|
||||
WATL_LexInfo watl__lex(Str8 source, Opts_watl_lex* opts) { WATL_LexInfo info = {0}; api_watl_lex(& info, source, opts); return info; }
|
||||
inline WATL_LexInfo watl__lex(Str8 source, Opts_watl_lex* opts) { WATL_LexInfo info = {0}; api_watl_lex(& info, source, opts); return info; }
|
||||
|
||||
void api_watl_parse(WATL_ParseInfo* info, Slice_WATL_Tok tokens, Opts_watl_parse* opts)
|
||||
{
|
||||
@@ -2147,7 +2156,7 @@ void api_watl_parse(WATL_ParseInfo* info, Slice_WATL_Tok tokens, Opts_watl_parse
|
||||
return;
|
||||
}
|
||||
}
|
||||
WATL_ParseInfo watl__parse(Slice_WATL_Tok tokens, Opts_watl_parse* opts) { WATL_ParseInfo info = {0}; api_watl_parse(& info, tokens, opts); return info; }
|
||||
inline WATL_ParseInfo watl__parse(Slice_WATL_Tok tokens, Opts_watl_parse* opts) { WATL_ParseInfo info = {0}; api_watl_parse(& info, tokens, opts); return info; }
|
||||
|
||||
Str8 watl_dump_listing(AllocatorInfo buffer, Slice_WATL_Line lines)
|
||||
{
|
||||
|
0
C/watl.v1.msvc.c
Normal file
0
C/watl.v1.msvc.c
Normal file
12
Readme.md
12
Readme.md
@@ -15,3 +15,15 @@ start:
|
||||
file.write_str(str.fmt("<name>.listing.source", self.source.name))
|
||||
end
|
||||
```
|
||||
|
||||
## TODOs
|
||||
|
||||
- [] Multi-threaded C example
|
||||
- [] Add basic timing benchmark to C examples
|
||||
- [] Add profiling support C examples
|
||||
- [] Make C++ examples
|
||||
- [] Add basic timing benchmark to C++ examples
|
||||
- [] Add profiling support C++ examples
|
||||
- [] Make Odin examples
|
||||
- [] Add basic timing benchmark to Odin examples
|
||||
- [] Add profiling support Odin examples
|
||||
|
@@ -21,6 +21,7 @@ $flag_exceptions_disabled = '/EHsc-'
|
||||
$flag_RTTI_disabled = '/GR-'
|
||||
$flag_include = '/I'
|
||||
$flag_full_src_path = '/FC'
|
||||
$flag_asm_listing_file = '/FAs'
|
||||
$flag_nologo = '/nologo'
|
||||
$flag_dll = '/LD'
|
||||
$flag_dll_debug = '/LDd'
|
||||
@@ -42,6 +43,7 @@ $flag_link_win_rt_static_debug = '/MTd'
|
||||
$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE'
|
||||
$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS'
|
||||
$flag_no_optimization = '/Od'
|
||||
$flag_optimize_speed_max = '/Ox'
|
||||
$flag_optimize_fast = '/O2'
|
||||
$flag_optimize_size = '/O1'
|
||||
$flag_optimize_intrinsics = '/Oi'
|
||||
@@ -102,15 +104,18 @@ if ($false) {
|
||||
|
||||
# Diagnostic logging
|
||||
$compiler_args += $flag_full_src_path
|
||||
$compiler_args += $flag_asm_listing_file
|
||||
|
||||
$compiler_args += $flag_optimize_intrinsics
|
||||
# $compiler_args += $flag_optimize_speed_max
|
||||
$compiler_args += $flag_optimize_size
|
||||
# $compiler_args += $flag_optimize_intrinsics
|
||||
# $compiler_args += $flag_no_optimization
|
||||
|
||||
# Debug setup
|
||||
$compiler_args += ($flag_define + 'BUILD_DEBUG')
|
||||
$compiler_args += $flag_debug
|
||||
$compiler_args += ( $flag_path_debug + $path_build + '\' )
|
||||
$compiler_args += $flag_link_win_rt_static_debug
|
||||
$compiler_args += $flag_link_win_rt_static
|
||||
|
||||
# Include setup
|
||||
$compiler_args += ($flag_include + $path_root)
|
||||
|
Reference in New Issue
Block a user