gb.h v0.05 & gb_gl.h v0.04

This commit is contained in:
gingerBill 2016-04-27 16:42:46 +01:00
parent 0431e9e03c
commit 2b69f77e70
3 changed files with 584 additions and 286 deletions

View File

@ -4,9 +4,9 @@ gb single-file public domain libraries for C & C++
library | latest version | category | languages | description
----------------|----------------|----------|-----------|-------------
**gb.h** | 0.04 | misc | C, C++ | A C helper library for C & C++
**gb.h** | 0.05 | misc | C, C++ | A C helper library for C & C++
**gb_math.h** | 0.05 | math | C, C++ | A C/C++ vector math library geared towards game development
**gb_gl.h** | 0.03a | graphics | C, C++ | A C/C++ OpenGL Helper Library
**gb_gl.h** | 0.04 | graphics | C, C++ | A C/C++ OpenGL Helper Library
**gb_string.h** | 0.94 | strings | C, C++ | A better string library for C & C++ (this is built into gb.h too with custom allocator support!)
**gb_ini.h** | 0.92 | misc | C, C++ | A simple ini file loader library for C & C++

153
gb.h
View File

@ -1,4 +1,4 @@
/* gb.h - v0.04 - Ginger Bill's C Helper Library - public domain
/* gb.h - v0.05 - Ginger Bill's C Helper Library - public domain
- no warranty implied; use at your own risk
This is a single header file with a bunch of useful stuff
@ -26,6 +26,7 @@ Conventions used:
Version History:
0.05 - Radix Sort for unsigned integers (TODO: Other primitives)
0.04 - Better UTF support and search/sort procs
0.03 - Completely change procedure naming convention
0.02a - Bug fixes
@ -895,7 +896,16 @@ typedef GB_COMPARE_PROC(gbCompareProc);
GB_DEF void gb_qsort(void *base, isize count, isize size, gbCompareProc compare_proc);
// NOTE(bill): Returns index
// NOTE(bill): the count of temp == count of items
GB_DEF void gb_radix_sort_u8 (u8 *items, isize count, u8 *temp);
GB_DEF void gb_radix_sort_u16(u16 *items, isize count, u16 *temp);
GB_DEF void gb_radix_sort_u32(u32 *items, isize count, u32 *temp);
GB_DEF void gb_radix_sort_u64(u64 *items, isize count, u64 *temp);
// NOTE(bill): Returns index or -1 if not found
GB_DEF isize gb_binary_search(void const *base, isize count, isize size, void const *key, gbCompareProc compare_proc);
@ -2142,6 +2152,145 @@ gb_qsort(void *base, isize count, isize size, gbCompareProc compare_proc)
qsort(base, count, size, compare_proc);
}
void
gb_radix_sort_u8(u8 *items, isize count, u8 *temp)
{
u8 *source = items;
u8 *dest = temp;
isize i;
isize offsets[256] = {0};
i64 total = 0;
// NOTE(bill): First pass - count how many of each key
for (i = 0; i < count; i++) {
u8 radix_value = source[i];
u8 radix_piece = radix_value & 0xff;
offsets[radix_piece]++;
}
// NOTE(bill): Change counts to offsets
for (i = 0; i < gb_count_of(offsets); i++) {
u8 skcount = offsets[i];
offsets[i] = total;
total += skcount;
}
// NOTE(bill): Second pass - place elements into the right location
for (i = 0; i < count; i++) {
u8 radix_value = source[i];
u8 radix_piece = radix_value & 0xff;
dest[offsets[radix_piece]++] = source[i];
}
gb_swap(u8 *, source, dest);
}
void
gb_radix_sort_u16(u16 *items, isize count, u16 *temp)
{
u16 *source = items;
u16 *dest = temp;
isize byte_index, i;
for (byte_index = 0; byte_index < 16; byte_index += 8) {
isize offsets[256] = {0};
i64 total = 0;
// NOTE(bill): First pass - count how many of each key
for (i = 0; i < count; i++) {
u16 radix_value = source[i];
u16 radix_piece = (radix_value >> byte_index) & 0xff;
offsets[radix_piece]++;
}
// NOTE(bill): Change counts to offsets
for (i = 0; i < gb_count_of(offsets); i++) {
u16 skcount = offsets[i];
offsets[i] = total;
total += skcount;
}
// NOTE(bill): Second pass - place elements into the right location
for (i = 0; i < count; i++) {
u16 radix_value = source[i];
u16 radix_piece = (radix_value >> byte_index) & 0xff;
dest[offsets[radix_piece]++] = source[i];
}
gb_swap(u16 *, source, dest);
}
}
void
gb_radix_sort_u32(u32 *items, isize count, u32 *temp)
{
u32 *source = items;
u32 *dest = temp;
isize byte_index, i;
for (byte_index = 0; byte_index < 32; byte_index += 8) {
isize offsets[256] = {0};
i64 total = 0;
// NOTE(bill): First pass - count how many of each key
for (i = 0; i < count; i++) {
u32 radix_value = source[i];
u32 radix_piece = (radix_value >> byte_index) & 0xff;
offsets[radix_piece]++;
}
// NOTE(bill): Change counts to offsets
for (i = 0; i < gb_count_of(offsets); i++) {
u32 skcount = offsets[i];
offsets[i] = total;
total += skcount;
}
// NOTE(bill): Second pass - place elements into the right location
for (i = 0; i < count; i++) {
u32 radix_value = source[i];
u32 radix_piece = (radix_value >> byte_index) & 0xff;
dest[offsets[radix_piece]++] = source[i];
}
gb_swap(u32 *, source, dest);
}
}
void
gb_radix_sort_u64(u64 *items, isize count, u64 *temp)
{
u64 *source = items;
u64 *dest = temp;
isize byte_index, i;
for (byte_index = 0; byte_index < 32; byte_index += 8) {
isize offsets[256] = {0};
i64 total = 0;
// NOTE(bill): First pass - count how many of each key
for (i = 0; i < count; i++) {
u64 radix_value = source[i];
u64 radix_piece = (radix_value >> byte_index) & 0xff;
offsets[radix_piece]++;
}
// NOTE(bill): Change counts to offsets
for (i = 0; i < gb_count_of(offsets); i++) {
u64 skcount = offsets[i];
offsets[i] = total;
total += skcount;
}
// NOTE(bill): Second pass - place elements into the right location
for (i = 0; i < count; i++) {
u64 radix_value = source[i];
u64 radix_piece = (radix_value >> byte_index) & 0xff;
dest[offsets[radix_piece]++] = source[i];
}
gb_swap(u64 *, source, dest);
}
}
gb_inline isize

675
gb_gl.h

File diff suppressed because it is too large Load Diff