gb.hpp - Allocators can be passed to gb_alloc/free/etc. without cast using `typedef void *gb_Allocator_Ptr`
This commit is contained in:
parent
bd2171ddf4
commit
6b0de059ff
|
@ -5,9 +5,9 @@ gb single-file public domain libraries for C & C++
|
|||
library | latest version | category | languages | description
|
||||
----------------|----------------|----------|-----------|-------------
|
||||
**gb_string.h** | 0.93 | strings | C, C++ | A better string library for C & C++
|
||||
**gb.hpp** | 0.31 | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development
|
||||
**gb.hpp** | 0.31a | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development
|
||||
**gb_math.hpp** | 0.03a | math | C++11 | A C++11 math library geared towards game development
|
||||
**gb.h** | 0.02 | misc | C | (Experimental) A C helpher library geared towards game development (port of gb.hpp)
|
||||
**gb.h** | 0.03 | misc | C | (Experimental) A C helpher library geared towards game development (port of gb.hpp)
|
||||
**gb_ini.h** | 0.91a | misc | C, C++ | A simple ini file loader library for C & C++
|
||||
|
||||
## FAQ
|
||||
|
|
148
gb.h
148
gb.h
|
@ -1,4 +1,4 @@
|
|||
/* gb.h - v0.02 - public domain C helper library - no warranty implied; use at your own risk */
|
||||
/* gb.h - v0.03 - public domain C helper library - no warranty implied; use at your own risk */
|
||||
/* (Experimental) A C helper library geared towards game development */
|
||||
|
||||
/*
|
||||
|
@ -16,6 +16,7 @@
|
|||
/*
|
||||
Version History:
|
||||
|
||||
0.03 - Allocators can be passed to gb_alloc/free/etc. without cast using `typedef void *gb_Allocator_Ptr`
|
||||
0.02 - Implement all functions (from gb.hpp)
|
||||
0.01 - Initial Version (just prototypes)
|
||||
*/
|
||||
|
@ -450,6 +451,9 @@ u32 gb_thread_current_id(void);
|
|||
#define GB_DEFAULT_ALIGNMENT 8
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NOTE(bill): The cost of the function pointer lookup is minor compared to the actually allocation in most cases
|
||||
*/
|
||||
typedef struct gb_Allocator {
|
||||
/* Allocates the specified amount of memory aligned to the specified alignment */
|
||||
void *(*alloc)(struct gb_Allocator *a, usize size, usize align);
|
||||
|
@ -463,21 +467,54 @@ typedef struct gb_Allocator {
|
|||
*/
|
||||
s64 (*allocated_size)(struct gb_Allocator *a, const void *ptr);
|
||||
|
||||
/* Returns the total amount of memory allocated by this allocator */
|
||||
/* If the allocator does not track memory, the function will return -1 */
|
||||
/* Returns the total amount of memory allocated by this allocator
|
||||
* If the allocator does not track memory, the function will return -1
|
||||
*/
|
||||
s64 (*total_allocated)(struct gb_Allocator *a);
|
||||
} gb_Allocator;
|
||||
|
||||
void *gb_alloc_align(gb_Allocator *a, usize size, usize align) { GB_ASSERT(a != NULL); return a->alloc(a, size, align); }
|
||||
void *gb_alloc(gb_Allocator *a, usize size) { GB_ASSERT(a != NULL); return gb_alloc_align(a, size, GB_DEFAULT_ALIGNMENT); }
|
||||
typedef void *gb_Allocator_Ptr;
|
||||
|
||||
void *
|
||||
gb_alloc_align(gb_Allocator_Ptr allocator, usize size, usize align)
|
||||
{
|
||||
GB_ASSERT(allocator != NULL);
|
||||
gb_Allocator *a = allocator;
|
||||
return a->alloc(a, size, align);
|
||||
}
|
||||
void *
|
||||
gb_alloc(gb_Allocator_Ptr allocator, usize size)
|
||||
{
|
||||
GB_ASSERT(allocator != NULL);
|
||||
return gb_alloc_align(allocator, size, GB_DEFAULT_ALIGNMENT);
|
||||
}
|
||||
|
||||
#define gb_alloc_struct(allocator, Type) cast(Type *, gb_alloc_align(allocator, sizeof(Type), alignof(Type)))
|
||||
#define gb_alloc_array(allocator, Type, count) cast(Type *, gb_alloc_align(allocator, sizeof(Type)*(count), alignof(Type)))
|
||||
|
||||
void gb_free(gb_Allocator *a, void *ptr) { GB_ASSERT(a != NULL); if (ptr) a->free(a, ptr); }
|
||||
void
|
||||
gb_free(gb_Allocator_Ptr allocator, void *ptr)
|
||||
{
|
||||
GB_ASSERT(allocator != NULL);
|
||||
gb_Allocator *a = allocator;
|
||||
if (ptr) a->free(a, ptr);
|
||||
}
|
||||
|
||||
s64 gb_allocated_size(gb_Allocator *a, const void *ptr) { GB_ASSERT(a != NULL); return a->allocated_size(a, ptr); }
|
||||
s64 gb_total_allocated(gb_Allocator *a) { GB_ASSERT(a != NULL); return a->total_allocated(a); }
|
||||
s64
|
||||
gb_allocated_size(gb_Allocator_Ptr allocator, const void *ptr)
|
||||
{
|
||||
GB_ASSERT(allocator != NULL);
|
||||
gb_Allocator *a = allocator;
|
||||
return a->allocated_size(a, ptr);
|
||||
}
|
||||
|
||||
s64
|
||||
gb_total_allocated(gb_Allocator_Ptr allocator)
|
||||
{
|
||||
GB_ASSERT(allocator != NULL);
|
||||
gb_Allocator *a = allocator;
|
||||
return a->total_allocated(a);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -615,9 +652,14 @@ typedef struct gb_Array_Header {
|
|||
/**********************************/
|
||||
|
||||
|
||||
/* Pascal like strings in C */
|
||||
typedef char *gb_String;
|
||||
|
||||
#ifndef GB_STRING_SIZE
|
||||
#define GB_STRING_SIZE
|
||||
/* define GB_STRING_SIZE to allow for a custom size e.g. u16, usize, int, etc. */
|
||||
typedef u32 gb_String_Size;
|
||||
#endif
|
||||
|
||||
typedef struct gb_String_Header {
|
||||
gb_Allocator *allocator;
|
||||
|
@ -723,25 +765,73 @@ f32 gb_time_div_time(gb_Time num, gb_Time dom);
|
|||
#endif /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
// Woo hoo!
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
////////////////////////////////
|
||||
// //
|
||||
// Implemenation //
|
||||
// //
|
||||
////////////////////////////////
|
||||
#if defined(GB_IMPLEMENTATION)
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
|
@ -1235,7 +1325,7 @@ gb__heap_free(gb_Allocator *a, void *ptr)
|
|||
|
||||
if (heap->use_mutex) gb_mutex_lock(&heap->mutex);
|
||||
|
||||
heap->total_allocated_count -= gb_allocated_size(&heap->base, ptr);
|
||||
heap->total_allocated_count -= gb_allocated_size(heap, ptr);
|
||||
heap->allocation_count--;
|
||||
|
||||
#if defined (GB_SYSTEM_WINDOWS)
|
||||
|
@ -1440,7 +1530,7 @@ gb_make_temporary_arena_memory(gb_Arena *arena)
|
|||
void
|
||||
gb_temporary_arena_memory_free(gb_Temporary_Arena_Memory tmp)
|
||||
{
|
||||
GB_ASSERT(gb_total_allocated(&tmp.arena->base) >= tmp.original_count);
|
||||
GB_ASSERT(gb_total_allocated(tmp.arena) >= tmp.original_count);
|
||||
tmp.arena->total_allocated_count = tmp.original_count;
|
||||
GB_ASSERT(tmp.arena->temp_count > 0);
|
||||
tmp.arena->temp_count--;
|
||||
|
|
7
gb.hpp
7
gb.hpp
|
@ -1,4 +1,4 @@
|
|||
// gb.hpp - v0.31 - public domain C++11 helper library - no warranty implied; use at your own risk
|
||||
// gb.hpp - v0.31a - public domain C++11 helper library - no warranty implied; use at your own risk
|
||||
// (Experimental) A C++11 helper library without STL geared towards game development
|
||||
|
||||
/*
|
||||
|
@ -39,6 +39,7 @@ CONTENTS:
|
|||
|
||||
/*
|
||||
Version History:
|
||||
0.31a - Minor fixes
|
||||
0.31 - Remove `_Allocator` suffix for allocator types
|
||||
0.30 - sort::quick
|
||||
0.29 - GB_ASSERT prints call stack
|
||||
|
@ -2277,6 +2278,8 @@ __GB_NAMESPACE_END
|
|||
// //
|
||||
////////////////////////////////
|
||||
|
||||
#if defined(GB_IMPLEMENTATION)
|
||||
|
||||
#if defined(GB_SYSTEM_WINDOWS)
|
||||
|
||||
#include <dbghelp.h>
|
||||
|
@ -2400,7 +2403,7 @@ gb__assert_handler(bool condition, const char* condition_str,
|
|||
}
|
||||
|
||||
|
||||
#if defined(GB_IMPLEMENTATION)
|
||||
|
||||
__GB_NAMESPACE_START
|
||||
|
||||
////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue