From 34c3481c19388e6c6e14840ebf07859bfc65b2d5 Mon Sep 17 00:00:00 2001 From: Doyle Thai Date: Sat, 15 Apr 2017 15:23:05 +1000 Subject: [PATCH] Fix non-compile issues in non-unity builds --- dqn.h | 359 +++++++++++++++++++++++++++------------------------------- 1 file changed, 166 insertions(+), 193 deletions(-) diff --git a/dqn.h b/dqn.h index f552f51..0be88bc 100644 --- a/dqn.h +++ b/dqn.h @@ -18,12 +18,16 @@ // HEADER // //////////////////////////////////////////////////////////////////////////////// -#include "stdint.h" -#include "math.h" -#define STB_SPRINTF_IMPLEMENTATION +#include "stdint.h" // For standard types +#include "math.h" // For trigonometry functions (for now) +#include "stdlib.h" // For calloc, malloc, free #ifdef _WIN32 #define DQN_WIN32_ERROR_BOX(text, title) MessageBoxA(NULL, text, title, MB_OK); + #define DQN_WIN32 + + #define WIN32_LEAN_AND_MEAN + #include #endif #define LOCAL_PERSIST static @@ -64,22 +68,158 @@ struct DqnArray T *data; }; +#if 0 template -bool dqn_darray_init(DqnArray *array, size_t capacity); +bool dqn_darray_init (DqnArray *array, size_t capacity); template -bool dqn_darray_grow (DqnArray *array); +bool dqn_darray_grow (DqnArray *array); template -bool dqn_darray_push(DqnArray *array, T item); +bool dqn_darray_push (DqnArray *array, T item); template -T *dqn_darray_get (DqnArray *array, u64 index); +T *dqn_darray_get (DqnArray *array, u64 index); template -bool dqn_darray_clear(DqnArray *array); +bool dqn_darray_clear (DqnArray *array); template -bool dqn_darray_free (DqnArray *array); +bool dqn_darray_free (DqnArray *array); template -bool dqn_darray_remove(DqnArray *array, u64 index); +bool dqn_darray_remove (DqnArray *array, u64 index); template bool dqn_darray_remove_stable(DqnArray *array, u64 index); +#endif + +// Implementation taken from Milton, developed by Serge at +// https://github.com/serge-rgb/milton#license +template +bool dqn_darray_init(DqnArray *array, size_t capacity) +{ + if (!array) return false; + + array->data = (T *)calloc((size_t)capacity, sizeof(T)); + if (!array->data) return false; + + array->count = 0; + array->capacity = capacity; + return true; +} + +template +bool dqn_darray_grow(DqnArray *array) +{ + if (!array || !array->data) return false; + + const f32 GROWTH_FACTOR = 1.2f; + size_t newCapacity = (size_t)(array->capacity * GROWTH_FACTOR); + if (newCapacity == array->capacity) newCapacity++; + + T *newMem = (T *)realloc(array->data, (size_t)(newCapacity * sizeof(T))); + if (newMem) + { + array->data = newMem; + array->capacity = newCapacity; + return true; + } + else + { + return false; + } +} + +template +bool dqn_darray_push(DqnArray *array, T item) +{ + if (!array) return false; + + if (array->count >= array->capacity) + { + if (!dqn_darray_grow(array)) return false; + } + + DQN_ASSERT(array->count < array->capacity); + array->data[array->count++] = item; + + return true; +} + +template +T *dqn_darray_get(DqnArray *array, u64 index) +{ + T *result = NULL; + if (index >= 0 && index <= array->count) result = &array->data[index]; + return result; +} + +template +bool dqn_darray_clear(DqnArray *array) +{ + if (array) + { + array->count = 0; + return true; + } + + return false; +} + +template +bool dqn_darray_free(DqnArray *array) +{ + if (array && array->data) + { + free(array->data); + array->count = 0; + array->capacity = 0; + return true; + } + + return false; +} + +template +bool dqn_darray_remove(DqnArray *array, u64 index) +{ + if (!array) return false; + if (index >= array->count) return false; + + bool firstElementAndOnlyElement = (index == 0 && array->count == 1); + bool isLastElement = (index == (array->count - 1)); + if (firstElementAndOnlyElement || isLastElement) + { + array->count--; + return true; + } + + array->data[index] = array->data[array->count - 1]; + array->count--; + return true; +} + +template +bool dqn_darray_remove_stable(DqnArray *array, u64 index) +{ + if (!array) return false; + if (index >= array->count) return false; + + bool firstElementAndOnlyElement = (index == 0 && array->count == 1); + bool isLastElement = (index == (array->count - 1)); + if (firstElementAndOnlyElement || isLastElement) + { + array->count--; + return true; + } + + size_t itemToRemoveByteOffset = (size_t)(index * sizeof(T)); + size_t oneAfterItemToRemoveByteOffset = (size_t)((index + 1) * sizeof(T)); + size_t lastItemByteOffset = (size_t)(array->count * sizeof(T)); + size_t numBytesToMove = lastItemByteOffset - oneAfterItemToRemoveByteOffset; + + u8 *bytePtr = (u8 *)array->data; + u8 *dest = &bytePtr[itemToRemoveByteOffset]; + u8 *src = &bytePtr[oneAfterItemToRemoveByteOffset]; + memmove(dest, src, numBytesToMove); + + array->count--; + return true; +} //////////////////////////////////////////////////////////////////////////////// // Math @@ -221,7 +361,6 @@ DQN_FILE_SCOPE u32 dqn_utf8_to_ucs(u32 *dest, u32 character); // Win32 Specific //////////////////////////////////////////////////////////////////////////////// #ifdef DQN_WIN32 - // Out is a pointer to the buffer to receive the characters. // outLen is the length/capacity of the out buffer DQN_FILE_SCOPE bool dqn_win32_utf8_to_wchar (const char *const in, wchar_t *const out, const i32 outLen); @@ -313,9 +452,10 @@ DQN_FILE_SCOPE u32 dqn_rnd_pcg_next (DqnRandPCGState *pcg); DQN_FILE_SCOPE f32 dqn_rnd_pcg_nextf(DqnRandPCGState *pcg); // Returns a random integer N between [min, max] DQN_FILE_SCOPE i32 dqn_rnd_pcg_range(DqnRandPCGState *pcg, i32 min, i32 max); - #endif /* DQN_H */ +#ifndef DQN_INI_H +#define DQN_INI_H //////////////////////////////////////////////////////////////////////////////// // ini.h v1.1 // Simple ini-file reader for C/C++. @@ -392,9 +532,6 @@ int main() } */ -#ifndef DQN_INI_H -#define DQN_INI_H - #define DQN_INI_GLOBAL_SECTION (0) #define DQN_INI_NOT_FOUND (-1) @@ -836,167 +973,19 @@ STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char comma, char peri #endif // STB_SPRINTF_H_INCLUDE -//////////////////////////////////////////////////////////////////////////////// -// -// IMPLEMENTATION -// -//////////////////////////////////////////////////////////////////////////////// #ifdef DQN_IMPLEMENTATION -#undef DQN_IMPLEMENTATION +//////////////////////////////////////////////////////////////////////////////// +// +// DQN_IMPLEMENTATION +// +//////////////////////////////////////////////////////////////////////////////// -// Enable sprintf implementation only when we enable DQN implementation -#define STB_SPRINTF_IMPLEMENTATION +// NOTE: STB_SPRINTF modified to be included when DQN_IMPLEMENTATION defined +// #define STB_SPRINTF_IMPLEMENTATION -// NOTE: We are currently using a custom INI lib provided in the public domain, -// hence it's separated from my main lib incase I want to implement my own -// version for learning purposes. -#define DQN_INI_IMPLEMENTATION +// NOTE: DQN_INI_IMPLEMENTATION modified to be included when DQN_IMPLEMENTATION defined +// #define DQN_INI_IMPLEMENTATION #define DQN_INI_STRLEN(s) dqn_strlen(s) - -#ifdef _WIN32 - #define DQN_WIN32 - - #include "Windows.h" - #define WIN32_LEAN_AND_MEAN -#endif - -//////////////////////////////////////////////////////////////////////////////// -// DArray - Dynamic Array -//////////////////////////////////////////////////////////////////////////////// -// Implementation taken from Milton, developed by Serge at -// https://github.com/serge-rgb/milton#license -template -bool dqn_darray_init(DqnArray *array, size_t capacity) -{ - if (!array) return false; - - array->data = (T *)calloc((size_t)capacity, sizeof(T)); - if (!array->data) return false; - - array->count = 0; - array->capacity = capacity; - return true; -} - -template -bool dqn_darray_grow(DqnArray *array) -{ - if (!array || !array->data) return false; - - const f32 GROWTH_FACTOR = 1.2f; - size_t newCapacity = (size_t)(array->capacity * GROWTH_FACTOR); - if (newCapacity == array->capacity) newCapacity++; - - T *newMem = (T *)realloc(array->data, (size_t)(newCapacity * sizeof(T))); - if (newMem) - { - array->data = newMem; - array->capacity = newCapacity; - return true; - } - else - { - return false; - } -} - -template -bool dqn_darray_push(DqnArray *array, T item) -{ - if (!array) return false; - - if (array->count >= array->capacity) - { - if (!dqn_darray_grow(array)) return false; - } - - DQN_ASSERT(array->count < array->capacity); - array->data[array->count++] = item; - - return true; -} - -template -T *dqn_darray_get(DqnArray *array, u64 index) -{ - T *result = NULL; - if (index >= 0 && index <= array->count) result = &array->data[index]; - return result; -} - -template -bool dqn_darray_clear(DqnArray *array) -{ - if (array) - { - array->count = 0; - return true; - } - - return false; -} - -template -bool dqn_darray_free(DqnArray *array) -{ - if (array && array->data) - { - free(array->data); - array->count = 0; - array->capacity = 0; - return true; - } - - return false; -} - -template -bool dqn_darray_remove(DqnArray *array, u64 index) -{ - if (!array) return false; - if (index >= array->count) return false; - - bool firstElementAndOnlyElement = (index == 0 && array->count == 1); - bool isLastElement = (index == (array->count - 1)); - if (firstElementAndOnlyElement || isLastElement) - { - array->count--; - return true; - } - - array->data[index] = array->data[array->count - 1]; - array->count--; - return true; -} - -template -bool dqn_darray_remove_stable(DqnArray *array, u64 index) -{ - if (!array) return false; - if (index >= array->count) return false; - - bool firstElementAndOnlyElement = (index == 0 && array->count == 1); - bool isLastElement = (index == (array->count - 1)); - if (firstElementAndOnlyElement || isLastElement) - { - array->count--; - return true; - } - - size_t itemToRemoveByteOffset = (size_t)(index * sizeof(T)); - size_t oneAfterItemToRemoveByteOffset = (size_t)((index + 1) * sizeof(T)); - size_t lastItemByteOffset = (size_t)(array->count * sizeof(T)); - size_t numBytesToMove = lastItemByteOffset - oneAfterItemToRemoveByteOffset; - - u8 *bytePtr = (u8 *)array->data; - u8 *dest = &bytePtr[itemToRemoveByteOffset]; - u8 *src = &bytePtr[oneAfterItemToRemoveByteOffset]; - memmove(dest, src, numBytesToMove); - - array->count--; - return true; -} - //////////////////////////////////////////////////////////////////////////////// // Math //////////////////////////////////////////////////////////////////////////////// @@ -1860,7 +1849,7 @@ DQN_FILE_SCOPE void dqn_win32_display_last_error(const char *const errorPrefix) #endif DQN_FILE_SCOPE bool dqn_file_open(const char *const path, DqnFile *const file, - const i32 permissionFlags, + const u32 permissionFlags, const enum DqnFileAction action) { if (!file || !path) return false; @@ -1971,7 +1960,7 @@ DQN_FILE_SCOPE u32 dqn_file_write(const DqnFile *const file, } -DQN_FILE_SCOPE inline void dqn_file_close(DqnFile *const file) +DQN_FILE_SCOPE void dqn_file_close(DqnFile *const file) { #ifdef DQN_WIN32 if (file && file->handle) @@ -2186,8 +2175,6 @@ DQN_FILE_SCOPE i32 dqn_rnd_pcg_range(DqnRandPCGState *pcg, i32 min, i32 max) i32 const value = (i32)(dqn_rnd_pcg_nextf(pcg) * range); return min + value; } -#endif /* DQN_IMPLEMENTATION */ - //////////////////////////////////////////////////////////////////////////////// // STB_Sprintf //////////////////////////////////////////////////////////////////////////////// @@ -2241,8 +2228,6 @@ PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): "...512 char string..." ( 35.0x/32.5x faster!) */ -#ifdef STB_SPRINTF_IMPLEMENTATION - #include // for va_arg() #define stbsp__uint32 unsigned int @@ -3224,23 +3209,10 @@ static stbsp__int32 stbsp__real_to_str( char const * * start, stbsp__uint32 * le #undef stbsp__int64 #undef STBSP__UNALIGNED -#endif // STB_SPRINTF_IMPLEMENTATION - - //////////////////////////////////////////////////////////////////////////////// -// ini.h v1.1 +// ini.h v1.1 | IMPLEMENTATION // Simple ini-file reader for C/C++. //////////////////////////////////////////////////////////////////////////////// - -/* ----------------------- - IMPLEMENTATION ----------------------- -*/ - -#ifdef DQN_INI_IMPLEMENTATION -#undef DQN_INI_IMPLEMENTATION - #define INITIAL_CAPACITY (256) #define _CRT_NONSTDC_NO_DEPRECATE @@ -3877,4 +3849,5 @@ void dqn_ini_property_value_set(DqnIni *ini, int section, int property, } } -#endif /* DQN_INI_IMPLEMENTATION */ +#endif /* DQN_IMPLEMENTATION */ +