gb.hpp - Fix Bugs

This commit is contained in:
gingerBill 2015-09-29 15:11:18 +01:00
parent b90f70412a
commit dfa72f255e
2 changed files with 111 additions and 41 deletions

View File

@ -5,9 +5,9 @@ gb single-file public domain libraries for C & C++
library | latest version | category | Languages | description library | latest version | category | Languages | description
----------------|----------------|----------|-----------|------------- ----------------|----------------|----------|-----------|-------------
**gb_string.h** | 0.92 | strings | C, C++ | A better string library for C & C++ **gb_string.h** | 0.93 | strings | C, C++ | A better string library for C & C++
**gb_ini.h** | 0.91 | misc | C, C++ | A simple ini file loader library for C & C++ **gb_ini.h** | 0.91 | misc | C, C++ | A simple ini file loader library for C & C++
**gb.hpp** | 0.02 | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development **gb.hpp** | 0.07 | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development
## FAQ ## FAQ

140
gb.hpp
View File

@ -1,7 +1,8 @@
// gb.hpp - v0.06 - public domain C++11 helper library - no warranty implied; use at your own risk // gb.hpp - v0.07 - 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 // (Experimental) A C++11 helper library without STL geared towards game development
// //
// Version History: // Version History:
// 0.07 - Bug Fixes
// 0.06 - Os spec ideas // 0.06 - Os spec ideas
// 0.05 - Transform Type and Quaternion Functions // 0.05 - Transform Type and Quaternion Functions
// 0.04 - String // 0.04 - String
@ -117,13 +118,15 @@
#define GB_IS_POWER_OF_TWO(x) ((x) != 0) && !((x) & ((x) - 1)) #define GB_IS_POWER_OF_TWO(x) ((x) != 0) && !((x) & ((x) - 1))
#include <float.h>
#include <math.h>
#include <stdarg.h> #include <stdarg.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#ifdef GB_SYSTEM_WINDOWS #ifdef GB_SYSTEM_WINDOWS
#include <windows.h> #include <windows.h>
@ -372,11 +375,14 @@ struct Heap_Allocator : Allocator
struct Arena_Allocator : Allocator struct Arena_Allocator : Allocator
{ {
s64 base_size = 0;
u8* base = nullptr; u8* base = nullptr;
s64 base_size = 0;
s64 total_allocated_count = 0; s64 total_allocated_count = 0;
s64 temp_count = 0; s64 temp_count = 0;
Arena_Allocator() = default;
explicit Arena_Allocator(void* base, usize base_size);
virtual void* alloc(usize size, usize align = GB_DEFAULT_ALIGNMENT); virtual void* alloc(usize size, usize align = GB_DEFAULT_ALIGNMENT);
virtual void dealloc(void* ptr); virtual void dealloc(void* ptr);
virtual s64 allocated_size(const void* ptr); virtual s64 allocated_size(const void* ptr);
@ -387,15 +393,6 @@ struct Arena_Allocator : Allocator
void check(); void check();
}; };
inline void
init_arena_allocator(Arena_Allocator& arena, void* base, usize base_size)
{
arena.base_size = base_size;
arena.base = (u8*)base;
arena.temp_count = 0;
arena.total_allocated_count = 0;
}
struct Temporary_Arena_Memory struct Temporary_Arena_Memory
{ {
Arena_Allocator* arena; Arena_Allocator* arena;
@ -977,7 +974,7 @@ multiple_count_from_hash_table(const Hash_Table<T>& h, u64 key)
while (e) while (e)
{ {
count++ count++
e + find_next_in_hash_table(h, e); e = find_next_in_hash_table(h, e);
} }
return count; return count;
@ -1279,23 +1276,51 @@ struct Quaternion
Vector3 xyz; Vector3 xyz;
f32 data[4]; f32 data[4];
}; };
inline const f32& operator[](usize index) const { return data[index]; }
inline f32& operator[](usize index) { return data[index]; }
}; };
struct Matrix2
{
union
{
struct { Vector2 x, y; };
Vector2 columns[2];
f32 data[4];
};
inline const Vector2& operator[](usize index) const { return columns[index]; }
inline Vector2& operator[](usize index) { return columns[index]; }
};
struct Matrix3
{
union
{
struct { Vector3 x, y, z; };
Vector3 columns[3];
f32 data[9];
};
inline const Vector3& operator[](usize index) const { return columns[index]; }
inline Vector3& operator[](usize index) { return columns[index]; }
};
struct Matrix4 struct Matrix4
{ {
union union
{ {
struct { Vector4 x, y, z, w; }; struct { Vector4 x, y, z, w; };
Vector4 column[4]; Vector4 columns[4];
f32 data[16]; f32 data[16];
}; };
inline const Vector4& operator[](usize index) const { return column[index]; } inline const Vector4& operator[](usize index) const { return columns[index]; }
inline Vector4& operator[](usize index) { return column[index]; } inline Vector4& operator[](usize index) { return columns[index]; }
}; };
struct Euler_Angles struct Euler_Angles
{ {
// NOTE(bill): All angles in radians // NOTE(bill): All angles in radians
@ -1598,7 +1623,53 @@ Transform inverse(const Transform& t);
Matrix4 transform_to_matrix4(const Transform& t); Matrix4 transform_to_matrix4(const Transform& t);
} // namespace math } // namespace math
#if 0
#ifdef GB_OPENGL_TOOLS
enum class Shader_Type
{
VERTEX,
FRAGMENT,
};
struct Shader_Program
{
#define GB_MAX_UNIFORM_COUNT 32
u32 handle;
b32 is_linked;
Allocator* allocator;
const char* base_directory;
u32 uniform_count;
const char* uniform_names[GB_MAX_UNIFORM_COUNT];
s32 uniform_locations[GB_MAX_UNIFORM_COUNT];
};
Shader_Program make_shader_program(gb::Allocator& allocator);
void destroy_shader_program(Shader_Program* program);
b32 attach_shader_from_file(Shader_Program* program, Shader_Type type, const char* filename);
b32 attach_shader_from_memory(Shader_Program* program, Shader_Type type, const char* source, usize len);
void use_shader_program(const Shader_Program* program);
b32 is_shader_program_in_use(const Shader_Program* program);
void stop_using_shader_program(const Shader_Program* program);
b32 link_shader_program(Shader_Program* program);
void bind_attrib_location(Shader_Program* program, const char* name);
s32 get_uniform_location(Shader_Program* program, const char* name);
#endif // GB_OPENGL_TOOLS
#endif
} // namespace gb } // namespace gb
#endif // GB_INCLUDE_GB_HPP #endif // GB_INCLUDE_GB_HPP
/// ///
@ -1667,16 +1738,6 @@ Matrix4 transform_to_matrix4(const Transform& t);
/// Implemenation /// /// Implemenation ///
//////////////////////////////// ////////////////////////////////
#ifdef GB_IMPLEMENTATION #ifdef GB_IMPLEMENTATION
#include <float.h>
#include <math.h>
#include <stdarg.h>
#include <time.h>
#ifdef GB_SYSTEM_WINDOWS
#include <windows.h>
#endif
namespace gb namespace gb
{ {
//////////////////////////////// ////////////////////////////////
@ -1805,6 +1866,14 @@ Heap_Allocator::get_header_ptr(const void* ptr)
return (Heap_Allocator::Header*)data; return (Heap_Allocator::Header*)data;
} }
Arena_Allocator::Arena_Allocator(void* base, usize base_size)
: base((u8*)base)
, base_size((s64)base_size)
, temp_count(0)
, total_allocated_count(0)
{
}
void* Arena_Allocator::alloc(usize size_init, usize align) void* Arena_Allocator::alloc(usize size_init, usize align)
{ {
usize size = size_init; usize size = size_init;
@ -1821,7 +1890,9 @@ void* Arena_Allocator::alloc(usize size_init, usize align)
return ptr; return ptr;
} }
s64 Arena_Allocator::allocated_size(const void* ptr) void Arena_Allocator::dealloc(void*) {}
s64 Arena_Allocator::allocated_size(const void*)
{ {
return -1; return -1;
} }
@ -2033,7 +2104,7 @@ void trim_string(String& str, const char* cut_set)
while (end_pos > start_pos && strchr(cut_set, *end_pos)) while (end_pos > start_pos && strchr(cut_set, *end_pos))
end_pos--; end_pos--;
String_Size len = (start_pos > end_pos) ? 0 : ((end_pos - start_pos)+1); String_Size len = (String_Size)((start_pos > end_pos) ? 0 : ((end_pos - start_pos)+1));
if (str != start_pos) if (str != start_pos)
memmove(str, start_pos, len); memmove(str, start_pos, len);
@ -2485,11 +2556,11 @@ void time_sleep(Time t)
#endif #endif
Time seconds(f32 s) { return {s * 1000000ll}; } Time seconds(f32 s) { return {(s64)(s * 1000000ll)}; }
Time milliseconds(s32 ms) { return {ms * 1000l}; } Time milliseconds(s32 ms) { return {(s64)(ms * 1000l)}; }
Time microseconds(s64 us) { return {us}; } Time microseconds(s64 us) { return {us}; }
f32 time_as_seconds(Time t) { return t.microseconds / 1000000.0f; } f32 time_as_seconds(Time t) { return (f32)(t.microseconds / 1000000.0f); }
s32 time_as_milliseconds(Time t) { return t.microseconds / 1000l; } s32 time_as_milliseconds(Time t) { return (s32)(t.microseconds / 1000l); }
s64 time_as_microseconds(Time t) { return t.microseconds; } s64 time_as_microseconds(Time t) { return t.microseconds; }
bool operator==(Time left, Time right) bool operator==(Time left, Time right)
@ -2907,7 +2978,6 @@ bool operator!=(const Quaternion& a, const Quaternion& b)
Quaternion operator-(const Quaternion& a) Quaternion operator-(const Quaternion& a)
{ {
return {-a.x, -a.y, -a.z, -a.w}; return {-a.x, -a.y, -a.z, -a.w};
return {-a.x, -a.y, -a.z, -a.w};
} }
Quaternion operator+(const Quaternion& a, const Quaternion& b) Quaternion operator+(const Quaternion& a, const Quaternion& b)
@ -3159,7 +3229,7 @@ inline f32 round(f32 x) { return ::roundf(x); }
inline s32 sign(s32 x) { return x >= 0 ? +1 : -1; } inline s32 sign(s32 x) { return x >= 0 ? +1 : -1; }
inline s64 sign(s64 x) { return x >= 0 ? +1 : -1; } inline s64 sign(s64 x) { return x >= 0 ? +1 : -1; }
inline f32 sign(f32 x) { return x >= 0 ? +1 : -1; } inline f32 sign(f32 x) { return x >= 0.0f ? +1.0f : -1.0f; }
// Other // Other
inline f32 abs(f32 x) inline f32 abs(f32 x)