aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar gingerBill 2015-12-14 23:53:20 +0000
committerGravatar gingerBill 2015-12-14 23:53:20 +0000
commit6b0de059ff29cc8e48552c93bb7336f36afda27c (patch)
tree5a1dd6bb3062dea72b26a952d9907b2eb99c8e74
parentUpdate README.md (diff)
gb.hpp - Allocators can be passed to gb_alloc/free/etc. without cast using `typedef void *gb_Allocator_Ptr`
-rw-r--r--README.md4
-rw-r--r--gb.h148
-rw-r--r--gb.hpp7
3 files changed, 126 insertions, 33 deletions
diff --git a/README.md b/README.md
index 8ad48ff..d7e0fb1 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/gb.h b/gb.h
index ed34d1a..e747792 100644
--- a/gb.h
+++ b/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--;
diff --git a/gb.hpp b/gb.hpp
index 7735cfd..89f7dff 100644
--- a/gb.hpp
+++ b/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
////////////////////////////////