Fix Dqn_FixedArray name convention, fix Windows build

This commit is contained in:
doyle 2021-12-19 00:08:19 +11:00
parent 05fe604f5c
commit 9d0b0a2982
2 changed files with 82 additions and 75 deletions

129
dqn.h
View File

@ -18,6 +18,7 @@
// #define DQN_WITH_JSON_WRITER // Dqn_JsonWriter // #define DQN_WITH_JSON_WRITER // Dqn_JsonWriter
// #define DQN_WITH_MAP // Dqn_Map // #define DQN_WITH_MAP // Dqn_Map
// #define DQN_WITH_MATH // Dqn_V2/3/4/Mat4 and friends ... // #define DQN_WITH_MATH // Dqn_V2/3/4/Mat4 and friends ...
// #define DQN_WITH_WIN_NET // Dqn_WinNet
// //
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// NOTE: Configuration // NOTE: Configuration
@ -349,7 +350,12 @@ static_assert(sizeof(Dqn_f64) == 8, "Sanity check f64 is 8 bytes
// NOTE: Win32 Minimal Header // NOTE: Win32 Minimal Header
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
#if defined(DQN_OS_WIN32) #if defined(DQN_OS_WIN32)
#if !defined(DQN_NO_WIN32_MINIMAL_HEADER) #if defined(DQN_NO_WIN32_MINIMAL_HEADER)
#include <bcrypt.h> // Dqn_OSSecureRNGBytes -> BCryptOpenAlgorithmProvider ... etc
#if defined(DQN_WITH_WIN_NET)
#include <wininet.h> // Dqn_WinNet -> InternetConnect ... etc
#endif // DQN_WITH_WIN_NET
#else
// Taken from Windows.h // Taken from Windows.h
typedef unsigned long DWORD; typedef unsigned long DWORD;
typedef unsigned short WORD; typedef unsigned short WORD;
@ -1240,16 +1246,15 @@ struct Dqn_Lib
#if defined(DQN_OS_WIN32) #if defined(DQN_OS_WIN32)
LARGE_INTEGER win32_qpc_frequency; LARGE_INTEGER win32_qpc_frequency;
Dqn_TicketMutex win32_bcrypt_rng_mutex; Dqn_TicketMutex win32_bcrypt_rng_mutex;
BCRYPT_ALG_HANDLE win32_bcrypt_rng_handle; void *win32_bcrypt_rng_handle;
#endif #endif
#if defined(DQN_DEBUG_THREAD_CONTEXT) #if defined(DQN_DEBUG_THREAD_CONTEXT)
Dqn_TicketMutex thread_context_mutex; Dqn_TicketMutex thread_context_mutex;
Dqn_ArenaStats thread_context_arena_current_stats[256]; Dqn_ArenaStats thread_context_arena_current_stats[256];
Dqn_ArenaStats thread_context_arena_highest_stats[256]; Dqn_ArenaStats thread_context_arena_highest_stats[256];
int thread_context_arena_stats_size; Dqn_u8 thread_context_arena_stats_size;
#endif #endif
}; };
@ -1354,27 +1359,27 @@ DQN_FIXED_ARRAY_TEMPLATE struct Dqn_FixedArray
T const *operator+ (Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i <= size, "%I64d >= 0 && %I64d < %I64d", i, size); return data + i; } T const *operator+ (Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i <= size, "%I64d >= 0 && %I64d < %I64d", i, size); return data + i; }
}; };
DQN_FIXED_ARRAY_TEMPLATE DQN_API DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArray_Init(T const *item, int num); DQN_FIXED_ARRAY_TEMPLATE DQN_API DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArrayInit(T const *item, int num);
DQN_FIXED_ARRAY_TEMPLATE DQN_API Dqn_isize Dqn_FixedArray_Max(DQN_FIXED_ARRAY_TEMPLATE_DECL const *); DQN_FIXED_ARRAY_TEMPLATE DQN_API Dqn_isize Dqn_FixedArrayMax(DQN_FIXED_ARRAY_TEMPLATE_DECL const *);
// Calculate the index of a item from the its pointer // Calculate the index of a item from the its pointer
DQN_FIXED_ARRAY_TEMPLATE DQN_API Dqn_isize Dqn_FixedArray_GetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a, T const *entry); DQN_FIXED_ARRAY_TEMPLATE DQN_API Dqn_isize Dqn_FixedArrayGetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a, T const *entry);
// return: The newly added item, nullptr if failed // return: The newly added item, nullptr if failed
DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items, Dqn_isize num); DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArrayAdd(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items, Dqn_isize num);
DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const &item); DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArrayAdd(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const &item);
// Bump the size of the array and return a pointer to 'num' uninitialised elements // Bump the size of the array and return a pointer to 'num' uninitialised elements
DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArray_Make(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num); DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArrayMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num);
DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArray_Clear(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_ZeroMem zero_mem = Dqn_ZeroMem::No); DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArrayClear(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_ZeroMem zero_mem = Dqn_ZeroMem::No);
DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArray_EraseStable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index); DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArrayEraseStable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index);
DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArray_EraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index); DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArrayEraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index);
DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArray_Pop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num = 1, Dqn_ZeroMem zero_mem = Dqn_ZeroMem::No); DQN_FIXED_ARRAY_TEMPLATE DQN_API void Dqn_FixedArrayPop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num = 1, Dqn_ZeroMem zero_mem = Dqn_ZeroMem::No);
DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArray_Peek(DQN_FIXED_ARRAY_TEMPLATE_DECL *a); DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArrayPeek(DQN_FIXED_ARRAY_TEMPLATE_DECL *a);
DQN_FIXED_ARRAY_TEMPLATE DQN_API T Dqn_FixedArray_PeekCopy(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a); DQN_FIXED_ARRAY_TEMPLATE DQN_API T Dqn_FixedArrayPeekCopy(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a);
template <typename T, int MAX_, typename IsEqual> DQN_API T *Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, IsEqual IsEqualProc); template <typename T, int MAX_, typename IsEqual> DQN_API T *Dqn_FixedArrayFind(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, IsEqual IsEqualProc);
template <typename T, int MAX_, typename IsEqual> DQN_API Dqn_b32 Dqn_FixedArray_FindElseMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T **entry, IsEqual IsEqualProc); template <typename T, int MAX_, typename IsEqual> DQN_API Dqn_b32 Dqn_FixedArrayFindElseMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T **entry, IsEqual IsEqualProc);
DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T *find); DQN_FIXED_ARRAY_TEMPLATE DQN_API T *Dqn_FixedArrayFind(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T *find);
#endif // DQN_WITH_FIXED_ARRAY #endif // DQN_WITH_FIXED_ARRAY
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
@ -1897,7 +1902,7 @@ DQN_API char *Dqn_U64ToTempStr(Dqn_u64 val, Dqn_b32 comma_sep = true);
struct Dqn_ThreadScratchData struct Dqn_ThreadScratchData
{ {
Dqn_Arena arena; Dqn_Arena arena;
Dqn_i8 arena_stats_index; // Index into Dqn_Lib's thread context arena stats array Dqn_u8 arena_stats_index; // Index into Dqn_Lib's thread context arena stats array
}; };
struct Dqn_ThreadContext struct Dqn_ThreadContext
@ -2010,7 +2015,7 @@ DQN_API Dqn_WinErrorMsg Dqn_WinLastError ();
DQN_API void Dqn__WinDumpLastError(Dqn_String file, Dqn_String function, Dqn_uint line, char const *fmt, ...); DQN_API void Dqn__WinDumpLastError(Dqn_String file, Dqn_String function, Dqn_uint line, char const *fmt, ...);
// return: The size required not including the null-terminator // return: The size required not including the null-terminator
int Dqn_WinUTF8ToWCharSizeRequired(Dqn_String src); DQN_API int Dqn_WinUTF8ToWCharSizeRequired(Dqn_String src);
// Converts the UTF8 string into a wide string. This function always // Converts the UTF8 string into a wide string. This function always
// null-terminates the buffer. If you use the SizeRequired(...) function, this // null-terminates the buffer. If you use the SizeRequired(...) function, this
@ -2051,6 +2056,7 @@ struct Dqn_WinFolderIterator
DQN_API bool Dqn_WinFolderIterate(Dqn_String path, Dqn_WinFolderIterator *it); DQN_API bool Dqn_WinFolderIterate(Dqn_String path, Dqn_WinFolderIterator *it);
DQN_API bool Dqn_WinFolderWIterate(Dqn_StringW path, Dqn_WinFolderIteratorW *it); DQN_API bool Dqn_WinFolderWIterate(Dqn_StringW path, Dqn_WinFolderIteratorW *it);
#if defined(DQN_WITH_WIN_NET)
enum struct Dqn_WinNetHandleState enum struct Dqn_WinNetHandleState
{ {
Invalid, Invalid,
@ -2107,19 +2113,20 @@ struct Dqn_WinNetHandle
// Initialise a new networking handle that is pointing to the specified URL. // Initialise a new networking handle that is pointing to the specified URL.
// The URL string must be null-terminated because Windows is a C API and // The URL string must be null-terminated because Windows is a C API and
// requires null-termination. // requires null-termination.
Dqn_WinNetHandle Dqn_WinNetHandleInitCString(char const *url, int url_size); DQN_API Dqn_WinNetHandle Dqn_WinNetHandleInitCString(char const *url, int url_size);
Dqn_WinNetHandle Dqn_WinNetHandleInitString(Dqn_String url); DQN_API Dqn_WinNetHandle Dqn_WinNetHandleInitString(Dqn_String url);
void Dqn_WinNetHandleFinish(Dqn_WinNetHandle *handle); DQN_API void Dqn_WinNetHandleFinish(Dqn_WinNetHandle *handle);
bool Dqn_WinNetHandleIsValid(Dqn_WinNetHandle const *handle); DQN_API bool Dqn_WinNetHandleIsValid(Dqn_WinNetHandle const *handle);
void Dqn_WinNetHandleSetUserAgentCString(Dqn_WinNetHandle *handle, char const *user_agent, int user_agent_size); DQN_API void Dqn_WinNetHandleSetUserAgentCString(Dqn_WinNetHandle *handle, char const *user_agent, int user_agent_size);
bool Dqn_WinNetHandlePump(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, char *dest, int dest_size, size_t *download_size); DQN_API bool Dqn_WinNetHandlePump(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, char *dest, int dest_size, size_t *download_size);
char * Dqn_WinNetHandlePumpToCString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, Dqn_Arena *arena, size_t *download_size); DQN_API char * Dqn_WinNetHandlePumpToCString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, Dqn_Arena *arena, size_t *download_size);
Dqn_String Dqn_WinNetHandlePumpToString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, Dqn_Arena *arena); DQN_API Dqn_String Dqn_WinNetHandlePumpToString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, Dqn_Arena *arena);
void Dqn_WinNetHandlePumpToCRTFile(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, FILE *file); DQN_API void Dqn_WinNetHandlePumpToCRTFile(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, FILE *file);
char *Dqn_WinNetHandlePumpToMallocCString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, size_t *download_size); DQN_API char *Dqn_WinNetHandlePumpToMallocCString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size, size_t *download_size);
Dqn_String Dqn_WinNetHandlePumpToMallocString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size); DQN_API Dqn_String Dqn_WinNetHandlePumpToMallocString(Dqn_WinNetHandle *handle, char const *http_verb, char *post_data, int post_data_size);
#endif // DQN_WITH_WIN_NET
#endif // DQN_OS_WIN32 #endif // DQN_OS_WIN32
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
@ -2584,7 +2591,7 @@ DQN_API Dqn_b32 Dqn_FixedStringAppend(Dqn_FixedString<MAX_> *str, Dqn_String src
template <Dqn_isize MAX_> template <Dqn_isize MAX_>
DQN_API Dqn_String Dqn_FixedStringToString(Dqn_FixedString<MAX_> const *str) DQN_API Dqn_String Dqn_FixedStringToString(Dqn_FixedString<MAX_> const *str)
{ {
auto result = Dqn_String_Init(str->str, str->size); auto result = Dqn_StringInit(str->str, str->size);
return result; return result;
} }
#endif // DQN_WITH_FIXED_STRING #endif // DQN_WITH_FIXED_STRING
@ -2603,22 +2610,22 @@ template <typename T> void Dqn__EraseStableFromCArray(T *array, Dqn_isize size,
// NOTE: Dqn_FixedArray Template Implementation // NOTE: Dqn_FixedArray Template Implementation
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArray_Init(T const *item, int num) DQN_API DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArrayInit(T const *item, int num)
{ {
DQN_FIXED_ARRAY_TEMPLATE_DECL result = {}; DQN_FIXED_ARRAY_TEMPLATE_DECL result = {};
Dqn_FixedArray_Add(&result, item, num); Dqn_FixedArrayAdd(&result, item, num);
return result; return result;
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API Dqn_isize Dqn_FixedArray_Max(DQN_FIXED_ARRAY_TEMPLATE_DECL const *) DQN_API Dqn_isize Dqn_FixedArrayMax(DQN_FIXED_ARRAY_TEMPLATE_DECL const *)
{ {
Dqn_isize result = MAX_; Dqn_isize result = MAX_;
return result; return result;
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API Dqn_isize Dqn_FixedArray_GetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a, T const *entry) DQN_API Dqn_isize Dqn_FixedArrayGetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a, T const *entry)
{ {
DQN_ASSERT(entry >= a->begin() && entry <= a->end()); DQN_ASSERT(entry >= a->begin() && entry <= a->end());
Dqn_isize result = a->end() - entry; Dqn_isize result = a->end() - entry;
@ -2626,7 +2633,7 @@ DQN_API Dqn_isize Dqn_FixedArray_GetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items, Dqn_isize num) DQN_API T *Dqn_FixedArrayAdd(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items, Dqn_isize num)
{ {
DQN_ASSERT(a->size + num <= MAX_); DQN_ASSERT(a->size + num <= MAX_);
T *result = static_cast<T *>(DQN_MEMCOPY(a->data + a->size, items, sizeof(T) * num)); T *result = static_cast<T *>(DQN_MEMCOPY(a->data + a->size, items, sizeof(T) * num));
@ -2635,7 +2642,7 @@ DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items,
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const &item) DQN_API T *Dqn_FixedArrayAdd(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const &item)
{ {
DQN_ASSERT(a->size < MAX_); DQN_ASSERT(a->size < MAX_);
a->data[a->size++] = item; a->data[a->size++] = item;
@ -2643,7 +2650,7 @@ DQN_API T *Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const &item)
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T *Dqn_FixedArray_Make(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num) DQN_API T *Dqn_FixedArrayMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num)
{ {
DQN_ASSERT(a->size + num <= MAX_); DQN_ASSERT(a->size + num <= MAX_);
T *result = a->data + a->size; T *result = a->data + a->size;
@ -2652,20 +2659,20 @@ DQN_API T *Dqn_FixedArray_Make(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num)
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API void Dqn_FixedArray_Clear(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_ZeroMem zero_mem) DQN_API void Dqn_FixedArrayClear(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_ZeroMem zero_mem)
{ {
a->size = 0; a->size = 0;
Dqn__ZeroMemBytes(a->data, sizeof(T) * MAX_, zero_mem); Dqn__ZeroMemBytes(a->data, sizeof(T) * MAX_, zero_mem);
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API void Dqn_FixedArray_EraseStable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index) DQN_API void Dqn_FixedArrayEraseStable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index)
{ {
Dqn__EraseStableFromCArray<T>(a->data, a->size--, MAX_, index); Dqn__EraseStableFromCArray<T>(a->data, a->size--, MAX_, index);
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API void Dqn_FixedArray_EraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index) DQN_API void Dqn_FixedArrayEraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index)
{ {
DQN_ASSERT(index >= 0 && index < a->size); DQN_ASSERT(index >= 0 && index < a->size);
if (--a->size == 0) return; if (--a->size == 0) return;
@ -2673,7 +2680,7 @@ DQN_API void Dqn_FixedArray_EraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API void Dqn_FixedArray_Pop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num, Dqn_ZeroMem zero_mem) DQN_API void Dqn_FixedArrayPop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num, Dqn_ZeroMem zero_mem)
{ {
DQN_ASSERT(a->size - num >= 0); DQN_ASSERT(a->size - num >= 0);
a->size -= num; a->size -= num;
@ -2684,14 +2691,14 @@ DQN_API void Dqn_FixedArray_Pop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num,
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T *Dqn_FixedArray_Peek(DQN_FIXED_ARRAY_TEMPLATE_DECL *a) DQN_API T *Dqn_FixedArrayPeek(DQN_FIXED_ARRAY_TEMPLATE_DECL *a)
{ {
T *result = (a->size == 0) ? nullptr : a->data + (a->size - 1); T *result = (a->size == 0) ? nullptr : a->data + (a->size - 1);
return result; return result;
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T Dqn_FixedArray_PeekCopy(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a) DQN_API T Dqn_FixedArrayPeekCopy(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a)
{ {
DQN_ASSERT(a->size > 0); DQN_ASSERT(a->size > 0);
T const *result = a->data + (a->size - 1); T const *result = a->data + (a->size - 1);
@ -2699,7 +2706,7 @@ DQN_API T Dqn_FixedArray_PeekCopy(DQN_FIXED_ARRAY_TEMPLATE_DECL const *a)
} }
template <typename T, int MAX_, typename IsEqual> template <typename T, int MAX_, typename IsEqual>
DQN_API T *Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, IsEqual IsEqualProc) DQN_API T *Dqn_FixedArrayFind(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, IsEqual IsEqualProc)
{ {
for (T &entry : (*a)) for (T &entry : (*a))
{ {
@ -2709,16 +2716,16 @@ DQN_API T *Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, IsEqual IsEqual
return nullptr; return nullptr;
} }
// return: True if the entry was found, false if not- the entry is made using Dqn_FixedArray_Make() in this case // return: True if the entry was found, false if not- the entry is made using Dqn_FixedArrayMake() in this case
template <typename T, int MAX_, typename IsEqual> template <typename T, int MAX_, typename IsEqual>
DQN_API Dqn_b32 Dqn_FixedArray_FindElseMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T **entry, IsEqual IsEqualProc) DQN_API Dqn_b32 Dqn_FixedArrayFindElseMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T **entry, IsEqual IsEqualProc)
{ {
Dqn_b32 result = true; Dqn_b32 result = true;
T *search = Dqn_FixedArray_Find(a, IsEqualProc); T *search = Dqn_FixedArrayFind(a, IsEqualProc);
if (!search) if (!search)
{ {
result = false; result = false;
search = Dqn_FixedArray_Make(a, 1); search = Dqn_FixedArrayMake(a, 1);
} }
*entry = search; *entry = search;
@ -2726,7 +2733,7 @@ DQN_API Dqn_b32 Dqn_FixedArray_FindElseMake(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T
} }
DQN_FIXED_ARRAY_TEMPLATE DQN_FIXED_ARRAY_TEMPLATE
DQN_API T *Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T *find) DQN_API T *Dqn_FixedArrayFind(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T *find)
{ {
for (T &entry : (*a)) for (T &entry : (*a))
{ {
@ -3010,9 +3017,6 @@ Dqn_b32 Dqn_ListIterate(Dqn_List<T> *list, Dqn_ListIterator<T> *iterator)
// NOTE: GetModuleFileNameW // NOTE: GetModuleFileNameW
#define ERROR_INSUFFICIENT_BUFFER 122L #define ERROR_INSUFFICIENT_BUFFER 122L
// NOTE: BCrypt
#define BCRYPT_RNG_ALGORITHM L"RNG"
// NOTE: MoveFile // NOTE: MoveFile
#define MOVEFILE_REPLACE_EXISTING 0x00000001 #define MOVEFILE_REPLACE_EXISTING 0x00000001
#define MOVEFILE_COPY_ALLOWED 0x00000002 #define MOVEFILE_COPY_ALLOWED 0x00000002
@ -6295,7 +6299,8 @@ DQN_API Dqn_b32 Dqn_OSSecureRNGBytes(void *buffer, Dqn_u32 size)
Dqn_TicketMutexBegin(&dqn__lib.win32_bcrypt_rng_mutex); Dqn_TicketMutexBegin(&dqn__lib.win32_bcrypt_rng_mutex);
if (!dqn__lib.win32_bcrypt_rng_handle) if (!dqn__lib.win32_bcrypt_rng_handle)
{ {
NTSTATUS init_status = BCryptOpenAlgorithmProvider(&dqn__lib.win32_bcrypt_rng_handle, BCRYPT_RNG_ALGORITHM, nullptr /*implementation*/, 0 /*flags*/); wchar_t const BCRYPT_ALGORITHM[] = L"RNG";
long /*NTSTATUS*/ init_status = BCryptOpenAlgorithmProvider(&dqn__lib.win32_bcrypt_rng_handle, BCRYPT_ALGORITHM, nullptr /*implementation*/, 0 /*flags*/);
if (!dqn__lib.win32_bcrypt_rng_handle || init_status != 0) if (!dqn__lib.win32_bcrypt_rng_handle || init_status != 0)
{ {
DQN_LOG_E("Failed to initialise random number generator, error: %d", init_status); DQN_LOG_E("Failed to initialise random number generator, error: %d", init_status);
@ -6640,8 +6645,8 @@ DQN_API void Dqn_LibDumpThreadContextArenaStats(Dqn_String file_path)
highest_cumulative_stats.block_count = DQN_MAX(highest_cumulative_stats.block_count, highest->block_count); highest_cumulative_stats.block_count = DQN_MAX(highest_cumulative_stats.block_count, highest->block_count);
} }
Dqn_ArenaStatsString cumulative_stats_string = Dqn_ArenaStats_String(&cumulative_stats); Dqn_ArenaStatsString cumulative_stats_string = Dqn_ArenaStatsToString(&cumulative_stats);
Dqn_ArenaStatsString highest_cumulative_stats_string = Dqn_ArenaStats_String(&highest_cumulative_stats); Dqn_ArenaStatsString highest_cumulative_stats_string = Dqn_ArenaStatsToString(&highest_cumulative_stats);
fprintf(file, " [ALL] CURR %.*s\n", cumulative_stats_string.size, cumulative_stats_string.str); fprintf(file, " [ALL] CURR %.*s\n", cumulative_stats_string.size, cumulative_stats_string.str);
fprintf(file, " HIGH %.*s\n", highest_cumulative_stats_string.size, highest_cumulative_stats_string.str); fprintf(file, " HIGH %.*s\n", highest_cumulative_stats_string.size, highest_cumulative_stats_string.str);
} }
@ -6654,8 +6659,8 @@ DQN_API void Dqn_LibDumpThreadContextArenaStats(Dqn_String file_path)
Dqn_ArenaStats const *current = current_stats + index; Dqn_ArenaStats const *current = current_stats + index;
Dqn_ArenaStats const *highest = current_stats + index; Dqn_ArenaStats const *highest = current_stats + index;
Dqn_ArenaStatsString current_string = Dqn_ArenaStats_String(current); Dqn_ArenaStatsString current_string = Dqn_ArenaStatsToString(current);
Dqn_ArenaStatsString highest_string = Dqn_ArenaStats_String(highest); Dqn_ArenaStatsString highest_string = Dqn_ArenaStatsToString(highest);
fprintf(file, " [%03d] CURR %.*s\n", DQN_CAST(int)index, current_string.size, current_string.str); fprintf(file, " [%03d] CURR %.*s\n", DQN_CAST(int)index, current_string.size, current_string.str);
fprintf(file, " HIGH %.*s\n", highest_string.size, highest_string.str); fprintf(file, " HIGH %.*s\n", highest_string.size, highest_string.str);
@ -7215,6 +7220,7 @@ DQN_API bool Dqn_WinFolderIterate(Dqn_String path, Dqn_WinFolderIterator *it)
return result; return result;
} }
#if defined(DQN_WITH_WIN_NET)
DQN_API Dqn_WinNetHandle Dqn_WinNetHandleInitCString(char const *url, int url_size) DQN_API Dqn_WinNetHandle Dqn_WinNetHandleInitCString(char const *url, int url_size)
{ {
URL_COMPONENTSA components = {}; URL_COMPONENTSA components = {};
@ -7488,7 +7494,8 @@ DQN_API Dqn_String Dqn_WinNetHandlePumpToMallocString(Dqn_WinNetHandle *handle,
Dqn_String result = Dqn_StringInit(download, download_size); Dqn_String result = Dqn_StringInit(download, download_size);
return result; return result;
} }
#endif #endif // DQN_WITH_WIN_NET
#endif // DQN_OS_WIN32
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
// NOTE: Hashing - Dqn_FNV1A[32|64] // NOTE: Hashing - Dqn_FNV1A[32|64]

View File

@ -312,56 +312,56 @@ Dqn_Test Dqn_Test_FixedArray()
Dqn_Test test = {}; Dqn_Test test = {};
#if defined(DQN_WITH_FIXED_ARRAY) #if defined(DQN_WITH_FIXED_ARRAY)
DQN_TEST_GROUP(test, "Dqn_FixedArray"); DQN_TEST_GROUP(test, "Dqn_FixedArray");
// NOTE: Dqn_FixedArray_Init // NOTE: Dqn_FixedArrayInit
{ {
DQN_TEST(test, "Initialise from raw array"); DQN_TEST(test, "Initialise from raw array");
int raw_array[] = {1, 2}; int raw_array[] = {1, 2};
auto array = Dqn_FixedArray_Init<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array)); auto array = Dqn_FixedArrayInit<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array));
DQN_TEST_ASSERT(test, array.size == 2); DQN_TEST_ASSERT(test, array.size == 2);
DQN_TEST_ASSERT(test, array[0] == 1); DQN_TEST_ASSERT(test, array[0] == 1);
DQN_TEST_ASSERT(test, array[1] == 2); DQN_TEST_ASSERT(test, array[1] == 2);
} }
// NOTE: Dqn_FixedArray_EraseStable // NOTE: Dqn_FixedArrayEraseStable
{ {
DQN_TEST(test, "Erase stable 1 element from array"); DQN_TEST(test, "Erase stable 1 element from array");
int raw_array[] = {1, 2, 3}; int raw_array[] = {1, 2, 3};
auto array = Dqn_FixedArray_Init<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array)); auto array = Dqn_FixedArrayInit<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array));
Dqn_FixedArray_EraseStable(&array, 1); Dqn_FixedArrayEraseStable(&array, 1);
DQN_TEST_ASSERT(test, array.size == 2); DQN_TEST_ASSERT(test, array.size == 2);
DQN_TEST_ASSERT(test, array[0] == 1); DQN_TEST_ASSERT(test, array[0] == 1);
DQN_TEST_ASSERT(test, array[1] == 3); DQN_TEST_ASSERT(test, array[1] == 3);
} }
// NOTE: Dqn_FixedArray_EraseUnstable // NOTE: Dqn_FixedArrayEraseUnstable
{ {
DQN_TEST(test, "Erase unstable 1 element from array"); DQN_TEST(test, "Erase unstable 1 element from array");
int raw_array[] = {1, 2, 3}; int raw_array[] = {1, 2, 3};
auto array = Dqn_FixedArray_Init<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array)); auto array = Dqn_FixedArrayInit<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array));
Dqn_FixedArray_EraseUnstable(&array, 0); Dqn_FixedArrayEraseUnstable(&array, 0);
DQN_TEST_ASSERT(test, array.size == 2); DQN_TEST_ASSERT(test, array.size == 2);
DQN_TEST_ASSERT(test, array[0] == 3); DQN_TEST_ASSERT(test, array[0] == 3);
DQN_TEST_ASSERT(test, array[1] == 2); DQN_TEST_ASSERT(test, array[1] == 2);
} }
// NOTE: Dqn_FixedArray_Add // NOTE: Dqn_FixedArrayAdd
{ {
DQN_TEST(test, "Add 1 element to array"); DQN_TEST(test, "Add 1 element to array");
int const ITEM = 2; int const ITEM = 2;
int raw_array[] = {1}; int raw_array[] = {1};
auto array = Dqn_FixedArray_Init<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array)); auto array = Dqn_FixedArrayInit<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array));
Dqn_FixedArray_Add(&array, ITEM); Dqn_FixedArrayAdd(&array, ITEM);
DQN_TEST_ASSERT(test, array.size == 2); DQN_TEST_ASSERT(test, array.size == 2);
DQN_TEST_ASSERT(test, array[0] == 1); DQN_TEST_ASSERT(test, array[0] == 1);
DQN_TEST_ASSERT(test, array[1] == ITEM); DQN_TEST_ASSERT(test, array[1] == ITEM);
} }
// NOTE: Dqn_FixedArray_Clear // NOTE: Dqn_FixedArrayClear
{ {
DQN_TEST(test, "Clear array"); DQN_TEST(test, "Clear array");
int raw_array[] = {1}; int raw_array[] = {1};
auto array = Dqn_FixedArray_Init<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array)); auto array = Dqn_FixedArrayInit<int, 4>(raw_array, (int)Dqn_ArrayCount(raw_array));
Dqn_FixedArray_Clear(&array); Dqn_FixedArrayClear(&array);
DQN_TEST_ASSERT(test, array.size == 0); DQN_TEST_ASSERT(test, array.size == 0);
} }
#endif // DQN_WITH_FIXED_ARRAY #endif // DQN_WITH_FIXED_ARRAY