mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 15:54:45 -08:00
Fixed regression with non-parsed code due to new global allocator setup
This commit is contained in:
parent
1c5881c5a3
commit
1fb3db379c
@ -197,10 +197,12 @@ namespace Memory
|
|||||||
{
|
{
|
||||||
// Doesn't recycle.
|
// Doesn't recycle.
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case EAllocation_FREE_ALL:
|
case EAllocation_FREE_ALL:
|
||||||
{
|
{
|
||||||
// Memory::cleanup instead.
|
// Memory::cleanup instead.
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case EAllocation_RESIZE:
|
case EAllocation_RESIZE:
|
||||||
{
|
{
|
||||||
if ( last->total_allocated + size > last->total_size )
|
if ( last->total_allocated + size > last->total_size )
|
||||||
|
276
project/gen.cpp
276
project/gen.cpp
@ -6110,7 +6110,281 @@ namespace gen
|
|||||||
sw Length;
|
sw Length;
|
||||||
};
|
};
|
||||||
|
|
||||||
ZPL_TABLE( static, TokMap, tokmap_, TokEntry )
|
typedef struct TokMapEntry
|
||||||
|
{
|
||||||
|
zpl::u64 key;
|
||||||
|
zpl::sw next;
|
||||||
|
TokEntry value;
|
||||||
|
} TokMapEntry;
|
||||||
|
typedef struct TokMap
|
||||||
|
{
|
||||||
|
zpl::sw *hashes;
|
||||||
|
TokMapEntry *entries;
|
||||||
|
} TokMap;
|
||||||
|
static void tokmap_init(TokMap *h, zpl::AllocatorInfo a);
|
||||||
|
static void tokmap_destroy(TokMap *h);
|
||||||
|
static void tokmap_clear(TokMap *h);
|
||||||
|
static TokEntry *tokmap_get(TokMap *h, zpl::u64 key);
|
||||||
|
static zpl::sw tokmap_slot(TokMap *h, zpl::u64 key);
|
||||||
|
static void tokmap_set(TokMap *h, zpl::u64 key, TokEntry value);
|
||||||
|
static void tokmap_grow(TokMap *h);
|
||||||
|
static void tokmap_rehash(TokMap *h, zpl::sw new_count);
|
||||||
|
static void tokmap_rehash_fast(TokMap *h);
|
||||||
|
static void tokmap_map(TokMap *h, void (*map_proc)(zpl::u64 key, TokEntry value));
|
||||||
|
static void tokmap_map_mut(TokMap *h, void (*map_proc)(zpl::u64 key, TokEntry *value));
|
||||||
|
static void tokmap_remove(TokMap *h, zpl::u64 key);
|
||||||
|
static void tokmap_remove_entry(TokMap *h, zpl::sw idx);
|
||||||
|
;
|
||||||
|
void tokmap_init(TokMap *h, zpl::AllocatorInfo a)
|
||||||
|
{
|
||||||
|
zpl::_array_init_reserve((void **)&(h->hashes), a, (zpl::sw)(sizeof(*(h->hashes))), ((2 * (0) + 8)));
|
||||||
|
zpl::_array_init_reserve((void **)&(h->entries), a, (zpl::sw)(sizeof(*(h->entries))), ((2 * (0) + 8)));
|
||||||
|
}
|
||||||
|
void tokmap_destroy(TokMap *h)
|
||||||
|
{
|
||||||
|
if (h->entries)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (h->entries)
|
||||||
|
{
|
||||||
|
zpl::ArrayHeader *_ah = ((zpl::ArrayHeader *)(h->entries) - 1);
|
||||||
|
zpl::free(_ah->allocator, _ah);
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
if (h->hashes)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (h->hashes)
|
||||||
|
{
|
||||||
|
zpl::ArrayHeader *_ah = ((zpl::ArrayHeader *)(h->hashes) - 1);
|
||||||
|
zpl::free(_ah->allocator, _ah);
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
void tokmap_clear(TokMap *h)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < (((zpl::ArrayHeader *)(h->hashes) - 1)->count); i++)
|
||||||
|
h->hashes[i] = -1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
((zpl::ArrayHeader *)(h->entries) - 1)->count = 0;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
zpl::sw tokmap_slot(TokMap *h, zpl::u64 key)
|
||||||
|
{
|
||||||
|
for (zpl::sw i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); i++)
|
||||||
|
{
|
||||||
|
if (h->entries[i].key == key)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
static zpl::sw tokmap__add_entry(TokMap *h, zpl::u64 key)
|
||||||
|
{
|
||||||
|
zpl::sw index;
|
||||||
|
TokMapEntry e = {0};
|
||||||
|
e.key = key;
|
||||||
|
e.next = -1;
|
||||||
|
index = (((zpl::ArrayHeader *)(h->entries) - 1)->count);
|
||||||
|
(zpl::_array_append_helper((void **)&(h->entries)) && (((h->entries)[(((zpl::ArrayHeader *)(h->entries) - 1)->count)++] = (e)), true));
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
static zpl::hash_table_find_result tokmap__find(TokMap *h, zpl::u64 key)
|
||||||
|
{
|
||||||
|
zpl::hash_table_find_result r = {-1, -1, -1};
|
||||||
|
if ((((zpl::ArrayHeader *)(h->hashes) - 1)->count) > 0)
|
||||||
|
{
|
||||||
|
r.hash_index = key % (((zpl::ArrayHeader *)(h->hashes) - 1)->count);
|
||||||
|
r.entry_index = h->hashes[r.hash_index];
|
||||||
|
while (r.entry_index >= 0)
|
||||||
|
{
|
||||||
|
if (h->entries[r.entry_index].key == key)
|
||||||
|
return r;
|
||||||
|
r.entry_prev = r.entry_index;
|
||||||
|
r.entry_index = h->entries[r.entry_index].next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
static zpl::b32 tokmap__full(TokMap *h) { return 0.75f * (((zpl::ArrayHeader *)(h->hashes) - 1)->count) < (((zpl::ArrayHeader *)(h->entries) - 1)->count); }
|
||||||
|
void tokmap_grow(TokMap *h)
|
||||||
|
{
|
||||||
|
zpl::sw new_count = (2 * ((((zpl::ArrayHeader *)(h->entries) - 1)->count)) + 8);
|
||||||
|
tokmap_rehash(h, new_count);
|
||||||
|
}
|
||||||
|
void tokmap_rehash(TokMap *h, zpl::sw new_count)
|
||||||
|
{
|
||||||
|
zpl::sw i, j;
|
||||||
|
TokMap nh = {0};
|
||||||
|
tokmap_init(&nh, (((zpl::ArrayHeader *)(h->hashes) - 1)->allocator));
|
||||||
|
zpl::_array_resize((void **)&(nh.hashes), (new_count));
|
||||||
|
zpl::_array_reserve((void **)&(nh.entries), ((((zpl::ArrayHeader *)(h->entries) - 1)->count)));
|
||||||
|
for (i = 0; i < new_count; i++)
|
||||||
|
nh.hashes[i] = -1;
|
||||||
|
for (i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); i++)
|
||||||
|
{
|
||||||
|
TokMapEntry *e;
|
||||||
|
zpl::hash_table_find_result fr;
|
||||||
|
if ((((zpl::ArrayHeader *)(nh.hashes) - 1)->count) == 0)
|
||||||
|
tokmap_grow(&nh);
|
||||||
|
e = &h->entries[i];
|
||||||
|
fr = tokmap__find(&nh, e->key);
|
||||||
|
j = tokmap__add_entry(&nh, e->key);
|
||||||
|
if (fr.entry_prev < 0)
|
||||||
|
nh.hashes[fr.hash_index] = j;
|
||||||
|
else
|
||||||
|
nh.entries[fr.entry_prev].next = j;
|
||||||
|
nh.entries[j].next = fr.entry_index;
|
||||||
|
nh.entries[j].value = e->value;
|
||||||
|
}
|
||||||
|
tokmap_destroy(h);
|
||||||
|
h->hashes = nh.hashes;
|
||||||
|
h->entries = nh.entries;
|
||||||
|
}
|
||||||
|
void tokmap_rehash_fast(TokMap *h)
|
||||||
|
{
|
||||||
|
zpl::sw i;
|
||||||
|
for (i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); i++)
|
||||||
|
h->entries[i].next = -1;
|
||||||
|
for (i = 0; i < (((zpl::ArrayHeader *)(h->hashes) - 1)->count); i++)
|
||||||
|
h->hashes[i] = -1;
|
||||||
|
for (i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); i++)
|
||||||
|
{
|
||||||
|
TokMapEntry *e;
|
||||||
|
zpl::hash_table_find_result fr;
|
||||||
|
e = &h->entries[i];
|
||||||
|
fr = tokmap__find(h, e->key);
|
||||||
|
if (fr.entry_prev < 0)
|
||||||
|
h->hashes[fr.hash_index] = i;
|
||||||
|
else
|
||||||
|
h->entries[fr.entry_prev].next = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TokEntry *tokmap_get(TokMap *h, zpl::u64 key)
|
||||||
|
{
|
||||||
|
zpl::sw index = tokmap__find(h, key).entry_index;
|
||||||
|
if (index >= 0)
|
||||||
|
return &h->entries[index].value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void tokmap_remove(TokMap *h, zpl::u64 key)
|
||||||
|
{
|
||||||
|
zpl::hash_table_find_result fr = tokmap__find(h, key);
|
||||||
|
if (fr.entry_index >= 0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
zpl::ArrayHeader *_ah = ((zpl::ArrayHeader *)(h->entries) - 1);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!(fr.entry_index < _ah->count))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("fr.entry_index < _ah->count", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, 0);
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
zpl::mem_move(h->entries + fr.entry_index, h->entries + fr.entry_index + 1, (zpl::sw)(sizeof(h->entries[0])) * (_ah->count - fr.entry_index - 1));
|
||||||
|
--_ah->count;
|
||||||
|
} while (0);
|
||||||
|
tokmap_rehash_fast(h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void tokmap_remove_entry(TokMap *h, zpl::sw idx)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
zpl::ArrayHeader *_ah = ((zpl::ArrayHeader *)(h->entries) - 1);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!(idx < _ah->count))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("idx < _ah->count", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, 0);
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
zpl::mem_move(h->entries + idx, h->entries + idx + 1, (zpl::sw)(sizeof(h->entries[0])) * (_ah->count - idx - 1));
|
||||||
|
--_ah->count;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
void tokmap_map(TokMap *h, void (*map_proc)(zpl::u64 key, TokEntry value))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!((h) != 0))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("( h ) != NULL", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, "h"
|
||||||
|
" must not be NULL");
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!((map_proc) != 0))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("( map_proc ) != NULL", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, "map_proc"
|
||||||
|
" must not be NULL");
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
for (zpl::sw i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); ++i)
|
||||||
|
{
|
||||||
|
map_proc(h->entries[i].key, h->entries[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void tokmap_map_mut(TokMap *h, void (*map_proc)(zpl::u64 key, TokEntry *value))
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!((h) != 0))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("( h ) != NULL", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, "h"
|
||||||
|
" must not be NULL");
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!((map_proc) != 0))
|
||||||
|
{
|
||||||
|
zpl::assert_handler("( map_proc ) != NULL", "C:\\projects\\gencpp\\project\\gen.cpp", (zpl::s64)6113, "map_proc"
|
||||||
|
" must not be NULL");
|
||||||
|
__debugbreak();
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
for (zpl::sw i = 0; i < (((zpl::ArrayHeader *)(h->entries) - 1)->count); ++i)
|
||||||
|
{
|
||||||
|
map_proc(h->entries[i].key, &h->entries[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void tokmap_set(TokMap *h, zpl::u64 key, TokEntry value)
|
||||||
|
{
|
||||||
|
zpl::sw index;
|
||||||
|
zpl::hash_table_find_result fr;
|
||||||
|
if ((((zpl::ArrayHeader *)(h->hashes) - 1)->count) == 0)
|
||||||
|
tokmap_grow(h);
|
||||||
|
fr = tokmap__find(h, key);
|
||||||
|
if (fr.entry_index >= 0)
|
||||||
|
{
|
||||||
|
index = fr.entry_index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index = tokmap__add_entry(h, key);
|
||||||
|
if (fr.entry_prev >= 0)
|
||||||
|
{
|
||||||
|
h->entries[fr.entry_prev].next = index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h->hashes[fr.hash_index] = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
h->entries[index].value = value;
|
||||||
|
if (tokmap__full(h))
|
||||||
|
tokmap_grow(h);
|
||||||
|
};
|
||||||
|
|
||||||
sw token_fmt_va( char* buf, uw buf_size, char const* fmt, s32 num_tokens, va_list va )
|
sw token_fmt_va( char* buf, uw buf_size, char const* fmt, s32 num_tokens, va_list va )
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ $path_scripts = Join-Path $path_root scripts
|
|||||||
Pop-Location
|
Pop-Location
|
||||||
|
|
||||||
# Test NonParsed
|
# Test NonParsed
|
||||||
if ($false) {
|
if ($true) {
|
||||||
$gencpp = Join-Path $path_gen_build gencpp.exe
|
$gencpp = Join-Path $path_gen_build gencpp.exe
|
||||||
|
|
||||||
Push-location $path_gen
|
Push-location $path_gen
|
||||||
|
@ -202,6 +202,11 @@ Code gen__array( StrC type, sw type_size )
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type* Data;
|
Type* Data;
|
||||||
|
|
||||||
|
operator Type*()
|
||||||
|
{
|
||||||
|
return Data;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
),
|
),
|
||||||
// Tokens
|
// Tokens
|
||||||
@ -210,14 +215,6 @@ Code gen__array( StrC type, sw type_size )
|
|||||||
, "type", type
|
, "type", type
|
||||||
));
|
));
|
||||||
|
|
||||||
Code op_ptr = untyped_str( code(
|
|
||||||
operator Type*()
|
|
||||||
{
|
|
||||||
return Data;
|
|
||||||
}
|
|
||||||
));
|
|
||||||
array.body()->add_entry( op_ptr );
|
|
||||||
|
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "Bloat.cpp"
|
#include "Bloat.cpp"
|
||||||
// #include "Parsed\Array.Parsed.hpp"
|
#include "Parsed\Array.Parsed.hpp"
|
||||||
// #include "Parsed\Buffer.Parsed.hpp"
|
// #include "Parsed\Buffer.Parsed.hpp"
|
||||||
// #include "Parsed\HashTable.Parsed.hpp"
|
// #include "Parsed\HashTable.Parsed.hpp"
|
||||||
// #include "Parsed\Ring.Parsed.hpp"
|
// #include "Parsed\Ring.Parsed.hpp"
|
||||||
@ -19,7 +19,7 @@ int gen_main()
|
|||||||
|
|
||||||
gen_sanity();
|
gen_sanity();
|
||||||
|
|
||||||
// gen_array( u8 );
|
gen_array( u8 );
|
||||||
// gen_array( sw );
|
// gen_array( sw );
|
||||||
|
|
||||||
// gen_buffer( u8 );
|
// gen_buffer( u8 );
|
||||||
@ -28,7 +28,7 @@ int gen_main()
|
|||||||
|
|
||||||
// gen_ring( s16 );
|
// gen_ring( s16 );
|
||||||
|
|
||||||
// gen_array_file();
|
gen_array_file();
|
||||||
// gen_buffer_file();
|
// gen_buffer_file();
|
||||||
// gen_hashtable_file();
|
// gen_hashtable_file();
|
||||||
// gen_ring_file();
|
// gen_ring_file();
|
||||||
|
Loading…
Reference in New Issue
Block a user