safe: Fix safe arithmetic functions
This commit is contained in:
parent
f45aed10ee
commit
64b65e1406
80
Code/Dqn.h
80
Code/Dqn.h
@ -96,7 +96,7 @@
|
|||||||
// Print
|
// Print
|
||||||
FILE *handle = (type == Dqn_LogType::Error) ? stderr : stdout;
|
FILE *handle = (type == Dqn_LogType::Error) ? stderr : stdout;
|
||||||
fprintf(handle,
|
fprintf(handle,
|
||||||
"%s %.*s %05zu %.*s ",
|
"%s %.*s %05I64u %.*s ",
|
||||||
Dqn_LogTypeString[DQN_CAST(int) type],
|
Dqn_LogTypeString[DQN_CAST(int) type],
|
||||||
(int)file_ptr_len,
|
(int)file_ptr_len,
|
||||||
file_ptr,
|
file_ptr,
|
||||||
@ -1718,7 +1718,7 @@ DQN_API Dqn_b32 Dqn_FixedString_AppendFmtV(Dqn_FixedString<MAX_> *str, char cons
|
|||||||
Dqn_isize require = stbsp_vsnprintf(nullptr, 0, fmt, va) + 1;
|
Dqn_isize require = stbsp_vsnprintf(nullptr, 0, fmt, va) + 1;
|
||||||
Dqn_isize space = MAX_ - str->size;
|
Dqn_isize space = MAX_ - str->size;
|
||||||
Dqn_b32 result = require <= space;
|
Dqn_b32 result = require <= space;
|
||||||
DQN_ASSERT_MSG(require <= space, "(require=%Id, space=%Id)", require, space);
|
DQN_ASSERT_MSG(require <= space, "(require=%I64d, space=%I64d)", require, space);
|
||||||
str->size += stbsp_vsnprintf(str->data + str->size, static_cast<int>(space), fmt, va2);
|
str->size += stbsp_vsnprintf(str->data + str->size, static_cast<int>(space), fmt, va2);
|
||||||
va_end(va2);
|
va_end(va2);
|
||||||
return result;
|
return result;
|
||||||
@ -1917,9 +1917,9 @@ Dqn_HashTable<T> Dqn_HashTable_InitWithMemory(void *mem, Dqn_isize mem_size)
|
|||||||
//
|
//
|
||||||
Dqn_isize bytes_required = bytes_for_values + bytes_for_usage_bitset;
|
Dqn_isize bytes_required = bytes_for_values + bytes_for_usage_bitset;
|
||||||
DQN_ASSERT_MSG(bytes_required <= mem_size,
|
DQN_ASSERT_MSG(bytes_required <= mem_size,
|
||||||
"(bytes_for_values = %Id, bytes_for_usage_bitset = %Id, mem_size = %Id)",
|
"(bytes_for_values = %I64d, bytes_for_usage_bitset = %I64d, mem_size = %I64d)",
|
||||||
bytes_for_values, bytes_for_usage_bitset, mem_size);
|
bytes_for_values, bytes_for_usage_bitset, mem_size);
|
||||||
DQN_ASSERT_MSG(bytes_required >= 0, "(bytes_required = %Iu)", bytes_required);
|
DQN_ASSERT_MSG(bytes_required >= 0, "(bytes_required = %I64u)", bytes_required);
|
||||||
|
|
||||||
Dqn_HashTable<T> result = {};
|
Dqn_HashTable<T> result = {};
|
||||||
result.values = DQN_CAST(T *) mem;
|
result.values = DQN_CAST(T *) mem;
|
||||||
@ -1989,7 +1989,7 @@ Dqn_b32 Dqn_HashTable_Erase(Dqn_HashTable<T> *table, Dqn_u64 key)
|
|||||||
table->count--;
|
table->count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_ASSERT_MSG(table->count >= 0, "(count = %Id)");
|
DQN_ASSERT_MSG(table->count >= 0, "(count = %I64d)");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2769,7 +2769,7 @@ DQN_API void Dqn_LogV(Dqn_LogType type, char const *file, Dqn_usize file_len, ch
|
|||||||
|
|
||||||
FILE *handle = (type == Dqn_LogType::Error) ? stderr : stdout;
|
FILE *handle = (type == Dqn_LogType::Error) ? stderr : stdout;
|
||||||
fprintf(handle,
|
fprintf(handle,
|
||||||
"[%s:%.*s:%05zu:%.*s] ",
|
"[%s:%.*s:%05I64u:%.*s] ",
|
||||||
Dqn_LogTypeString[DQN_CAST(int) type],
|
Dqn_LogTypeString[DQN_CAST(int) type],
|
||||||
(int)file_ptr_len,
|
(int)file_ptr_len,
|
||||||
file_ptr,
|
file_ptr,
|
||||||
@ -3445,7 +3445,7 @@ DQN_API Dqn_b32 Dqn_String_AppendFmtV(Dqn_String *str, char const *fmt, va_list
|
|||||||
Dqn_isize require = stbsp_vsnprintf(nullptr, 0, fmt, va) + 1;
|
Dqn_isize require = stbsp_vsnprintf(nullptr, 0, fmt, va) + 1;
|
||||||
Dqn_isize space = str->cap - str->size;
|
Dqn_isize space = str->cap - str->size;
|
||||||
Dqn_b32 result = require <= space;
|
Dqn_b32 result = require <= space;
|
||||||
DQN_ASSERT_MSG(require <= space, "(require=%Id, space=%Id)", require, space);
|
DQN_ASSERT_MSG(require <= space, "(require=%I64d, space=%I64d)", require, space);
|
||||||
str->size += stbsp_vsnprintf(str->str + str->size, static_cast<int>(space), fmt, va2);
|
str->size += stbsp_vsnprintf(str->str + str->size, static_cast<int>(space), fmt, va2);
|
||||||
va_end(va2);
|
va_end(va2);
|
||||||
return result;
|
return result;
|
||||||
@ -3587,7 +3587,7 @@ DQN_API Dqn_ArenaAllocator Dqn_ArenaAllocator_InitWithNewAllocator(Dqn_Allocator
|
|||||||
result.tracer = tracer;
|
result.tracer = tracer;
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%zu >= %zu) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%I64u >= %I64u) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
||||||
Dqn_ArenaAllocatorBlock *mem_block = Dqn_ArenaAllocator__AllocateBlock(&result, size DQN_CALL_SITE_ARGS_INPUT);
|
Dqn_ArenaAllocatorBlock *mem_block = Dqn_ArenaAllocator__AllocateBlock(&result, size DQN_CALL_SITE_ARGS_INPUT);
|
||||||
Dqn_ArenaAllocator__AttachBlock(&result, mem_block);
|
Dqn_ArenaAllocator__AttachBlock(&result, mem_block);
|
||||||
}
|
}
|
||||||
@ -3602,7 +3602,7 @@ DQN_API Dqn_ArenaAllocator Dqn_ArenaAllocator_InitWithAllocator(Dqn_Allocator *a
|
|||||||
result.tracer = tracer;
|
result.tracer = tracer;
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%zu >= %zu) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%I64u >= %I64u) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
||||||
Dqn_ArenaAllocatorBlock *mem_block = Dqn_ArenaAllocator__AllocateBlock(&result, size DQN_CALL_SITE_ARGS_INPUT);
|
Dqn_ArenaAllocatorBlock *mem_block = Dqn_ArenaAllocator__AllocateBlock(&result, size DQN_CALL_SITE_ARGS_INPUT);
|
||||||
Dqn_ArenaAllocator__AttachBlock(&result, mem_block);
|
Dqn_ArenaAllocator__AttachBlock(&result, mem_block);
|
||||||
}
|
}
|
||||||
@ -3614,7 +3614,7 @@ DQN_API Dqn_ArenaAllocator Dqn_ArenaAllocator_InitWithMemory(void *memory, Dqn_i
|
|||||||
Dqn_ArenaAllocator result = {};
|
Dqn_ArenaAllocator result = {};
|
||||||
result.tracer = tracer;
|
result.tracer = tracer;
|
||||||
|
|
||||||
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%zu >= %zu) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
DQN_ASSERT_MSG(size >= DQN_ISIZEOF(*result.curr_mem_block), "(%I64u >= %I64u) There needs to be enough space to encode the Dqn_ArenaAllocatorBlock struct into the memory buffer", size, sizeof(*result.curr_mem_block));
|
||||||
result.backup_allocator = Dqn_Allocator_InitWithNull();
|
result.backup_allocator = Dqn_Allocator_InitWithNull();
|
||||||
auto *mem_block = DQN_CAST(Dqn_ArenaAllocatorBlock *) memory;
|
auto *mem_block = DQN_CAST(Dqn_ArenaAllocatorBlock *) memory;
|
||||||
*mem_block = {};
|
*mem_block = {};
|
||||||
@ -3821,96 +3821,86 @@ DQN_API Dqn_b32 Dqn_Bit_IsNotSet(Dqn_u64 bits, Dqn_u64 bits_to_check)
|
|||||||
// -------------------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------------------
|
||||||
DQN_API Dqn_i64 Dqn_Safe_AddI64(Dqn_i64 a, Dqn_i64 b)
|
DQN_API Dqn_i64 Dqn_Safe_AddI64(Dqn_i64 a, Dqn_i64 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a <= DQN_I64_MAX - b, "%zu <= %zu", a, DQN_I64_MAX - b);
|
DQN_ASSERT_MSG(a <= DQN_I64_MAX - b, "%I64u <= %I64u", a, DQN_I64_MAX - b);
|
||||||
Dqn_i64 result = a + b;
|
Dqn_i64 result = (a <= DQN_I64_MAX - b) ? (a + b) : DQN_I64_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_i64 Dqn_Safe_MulI64(Dqn_i64 a, Dqn_i64 b)
|
DQN_API Dqn_i64 Dqn_Safe_MulI64(Dqn_i64 a, Dqn_i64 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a <= DQN_I64_MAX / b , "%zu <= %zu", a, DQN_I64_MAX / b);
|
DQN_ASSERT_MSG(a <= DQN_I64_MAX / b , "%I64u <= %I64u", a, DQN_I64_MAX / b);
|
||||||
Dqn_i64 result = a * b;
|
Dqn_i64 result = (a <= DQN_I64_MAX / b) ? (a * b) : DQN_I64_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_u64 Dqn_Safe_AddU64(Dqn_u64 a, Dqn_u64 b)
|
DQN_API Dqn_u64 Dqn_Safe_AddU64(Dqn_u64 a, Dqn_u64 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a <= DQN_U64_MAX - b, "%zu <= %zu", a, DQN_U64_MAX - b);
|
DQN_ASSERT_MSG(a <= DQN_U64_MAX - b, "%I64u <= %I64u", a, DQN_U64_MAX - b);
|
||||||
Dqn_u64 result = a + b;
|
Dqn_u64 result = (a <= DQN_U64_MAX / b) ? (a * b) : DQN_U64_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_u64 Dqn_Safe_SubU64(Dqn_u64 a, Dqn_u64 b)
|
DQN_API Dqn_u64 Dqn_Safe_SubU64(Dqn_u64 a, Dqn_u64 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a >= b, "%zu >= %zu", a, b);
|
DQN_ASSERT_MSG(a >= b, "%I64u >= %I64u", a, b);
|
||||||
Dqn_u64 result = a - b;
|
Dqn_u64 result = (a >= b) ? (a - b) : 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_u32 Dqn_Safe_SubU32(Dqn_u32 a, Dqn_u32 b)
|
DQN_API Dqn_u32 Dqn_Safe_SubU32(Dqn_u32 a, Dqn_u32 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a >= b, "%zu >= %zu", a, b);
|
DQN_ASSERT_MSG(a >= b, "%I64u >= %I64u", a, b);
|
||||||
Dqn_u32 result = a - b;
|
Dqn_u32 result = (a >= b) ? (a - b) : 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_u64 Dqn_Safe_MulU64(Dqn_u64 a, Dqn_u64 b)
|
DQN_API Dqn_u64 Dqn_Safe_MulU64(Dqn_u64 a, Dqn_u64 b)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(a <= DQN_U64_MAX / b , "%zu <= %zu", a, DQN_U64_MAX / b);
|
DQN_ASSERT_MSG(a <= DQN_U64_MAX / b , "%I64u <= %I64u", a, DQN_U64_MAX / b);
|
||||||
Dqn_u64 result = a * b;
|
Dqn_u64 result = (a <= DQN_U64_MAX / b) ? (a * b) : DQN_U64_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API int Dqn_Safe_TruncateISizeToInt(Dqn_isize val)
|
DQN_API int Dqn_Safe_TruncateISizeToInt(Dqn_isize val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val >= DQN_I32_MAX && val <= DQN_I32_MAX, "%zd >= %zd && %zd <= %zd", val, DQN_I32_MAX, val, DQN_I32_MAX);
|
DQN_ASSERT_MSG(val >= DQN_I32_MIN && val <= DQN_I32_MAX, "%I64d >= %I64d && %I64d <= %I64d", val, DQN_I32_MAX, val, DQN_I32_MAX);
|
||||||
auto result = (int)val;
|
auto result = (val >= DQN_I32_MIN && val <= DQN_I32_MAX) ? DQN_CAST(int)val : 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_i32 Dqn_Safe_TruncateISizeToI32(Dqn_isize val)
|
DQN_API Dqn_i32 Dqn_Safe_TruncateISizeToI32(Dqn_isize val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val >= DQN_I32_MIN && val <= DQN_I32_MAX, "%zd >= %zd && %zd <= %zd", val, DQN_I32_MIN, val, DQN_I32_MAX);
|
DQN_ASSERT_MSG(val >= DQN_I32_MIN && val <= DQN_I32_MAX, "%I64d >= %I64d && %I64d <= %I64d", val, DQN_I32_MIN, val, DQN_I32_MAX);
|
||||||
auto result = DQN_CAST(Dqn_i32)val;
|
auto result = (val >= DQN_I32_MIN && val <= DQN_I32_MAX) ? DQN_CAST(Dqn_i32)val : 0;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DQN_API Dqn_i8 Dqn_Safe_TruncateISizeToI8(Dqn_isize val)
|
|
||||||
{
|
|
||||||
DQN_ASSERT_MSG(val >= DQN_I8_MIN && val <= DQN_I8_MAX, "%zd >= %zd && %zd <= %zd", val, DQN_I8_MIN, val, DQN_I8_MAX);
|
|
||||||
auto result = DQN_CAST(Dqn_i8)val;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DQN_API Dqn_u32 Dqn_Safe_TruncateUSizeToU32(Dqn_u64 val)
|
DQN_API Dqn_u32 Dqn_Safe_TruncateUSizeToU32(Dqn_u64 val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val <= DQN_U32_MAX, "%zu <= %zu", val, DQN_U32_MAX);
|
DQN_ASSERT_MSG(val <= DQN_U32_MAX, "%I64u <= %I64u", val, DQN_U32_MAX);
|
||||||
auto result = DQN_CAST(Dqn_u32)val;
|
auto result = (val <= DQN_U32_MAX) ? DQN_CAST(Dqn_u32)val : DQN_U32_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DQN_API int Dqn_Safe_TruncateUSizeToI32(Dqn_usize val)
|
DQN_API Dqn_i32 Dqn_Safe_TruncateUSizeToI32(Dqn_usize val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val <= DQN_I32_MAX, "%zu <= %zd", val, DQN_I32_MAX);
|
DQN_ASSERT_MSG(val <= DQN_I32_MAX, "%I64u <= %I64d", val, DQN_I32_MAX);
|
||||||
auto result = DQN_CAST(int)val;
|
auto result = (val <= DQN_I32_MAX) ? DQN_CAST(int)val : DQN_I32_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DQN_API int Dqn_Safe_TruncateUSizeToInt(Dqn_usize val)
|
DQN_API int Dqn_Safe_TruncateUSizeToInt(Dqn_usize val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val <= DQN_I32_MAX, "%zu <= %zd", val, DQN_I32_MAX);
|
DQN_ASSERT_MSG(val <= DQN_I32_MAX, "%I64u <= %I64d", val, DQN_I32_MAX);
|
||||||
auto result = DQN_CAST(int)val;
|
auto result = (val <= DQN_I32_MAX) ? DQN_CAST(int)val : DQN_I32_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DQN_API Dqn_isize Dqn_Safe_TruncateUSizeToISize(Dqn_usize val)
|
DQN_API Dqn_isize Dqn_Safe_TruncateUSizeToISize(Dqn_usize val)
|
||||||
{
|
{
|
||||||
DQN_ASSERT_MSG(val <= DQN_CAST(Dqn_usize)DQN_ISIZE_MAX, "%zu <= %zu", val, DQN_CAST(Dqn_usize)DQN_ISIZE_MAX);
|
DQN_ASSERT_MSG(val <= DQN_ISIZE_MAX, "%I64u <= %I64u", val, DQN_CAST(Dqn_usize)DQN_ISIZE_MAX);
|
||||||
auto result = DQN_CAST(Dqn_isize)val;
|
auto result = (val <= DQN_ISIZE_MAX) ? DQN_CAST(Dqn_isize)val : DQN_ISIZE_MAX;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user