Add const iterator for arrays, remove head/tail API for memstacks
This commit is contained in:
parent
ed3f11dc7b
commit
2c80e53089
@ -385,6 +385,7 @@ FILE_SCOPE void DqnMemStack_Test()
|
|||||||
// Check stack allocator mem api callbacks
|
// Check stack allocator mem api callbacks
|
||||||
if (1)
|
if (1)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
// Realloc in same block and allow it to grow in place.
|
// Realloc in same block and allow it to grow in place.
|
||||||
if (1)
|
if (1)
|
||||||
{
|
{
|
||||||
@ -517,6 +518,7 @@ FILE_SCOPE void DqnMemStack_Test()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO(doyle): Realloc to smaller size logic
|
// TODO(doyle): Realloc to smaller size logic
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1684,7 +1684,8 @@ void DqnArray_Test()
|
|||||||
{
|
{
|
||||||
auto stack =
|
auto stack =
|
||||||
DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroClear::Yes, DqnMemStack::Flag::BoundsGuard);
|
DqnMemStack(DQN_MEGABYTE(1), Dqn::ZeroClear::Yes, DqnMemStack::Flag::BoundsGuard);
|
||||||
|
DQN_DEFER(stack.Free());
|
||||||
|
#if 0
|
||||||
if (1)
|
if (1)
|
||||||
{
|
{
|
||||||
auto memGuard0 = stack.TempRegionGuard();
|
auto memGuard0 = stack.TempRegionGuard();
|
||||||
@ -1702,7 +1703,7 @@ void DqnArray_Test()
|
|||||||
stack.Push(1024);
|
stack.Push(1024);
|
||||||
DqnArray_TestRealDataInternal(&array);
|
DqnArray_TestRealDataInternal(&array);
|
||||||
}
|
}
|
||||||
stack.Free();
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1863,9 +1864,7 @@ void DqnFile_Test()
|
|||||||
u8 *buffer = (u8 *)memStack.Push(reqSize);
|
u8 *buffer = (u8 *)memStack.Push(reqSize);
|
||||||
DQN_ASSERT(buffer);
|
DQN_ASSERT(buffer);
|
||||||
|
|
||||||
size_t bytesRead = 0;
|
DQN_ASSERT(DqnFile_ReadAll(fileNames[i], buffer, reqSize));
|
||||||
DQN_ASSERT(DqnFile_ReadAll(fileNames[i], buffer, reqSize, &bytesRead));
|
|
||||||
DQN_ASSERT(bytesRead == reqSize);
|
|
||||||
|
|
||||||
// Verify the data is the same as we wrote out
|
// Verify the data is the same as we wrote out
|
||||||
DQN_ASSERT(DqnStr_Cmp((char *)buffer, (writeData[i]), (i32)reqSize) == 0);
|
DQN_ASSERT(DqnStr_Cmp((char *)buffer, (writeData[i]), (i32)reqSize) == 0);
|
||||||
|
115
dqn.h
115
dqn.h
@ -1352,7 +1352,9 @@ struct DqnArray
|
|||||||
|
|
||||||
T &operator[] (isize i) const { DQN_ASSERT(i < count && i > 0); return this->data[i]; }
|
T &operator[] (isize i) const { DQN_ASSERT(i < count && i > 0); return this->data[i]; }
|
||||||
T *begin () { return data; }
|
T *begin () { return data; }
|
||||||
|
T *begin () const { return data; }
|
||||||
T *end () { return data + count; }
|
T *end () { return data + count; }
|
||||||
|
T *end () const { return data + count; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
isize GrowCapacity_(isize size) const { isize newMax = max ? (max * 2) : 8; return newMax > size ? newMax : size; }
|
isize GrowCapacity_(isize size) const { isize newMax = max ? (max * 2) : 8; return newMax > size ? newMax : size; }
|
||||||
@ -1504,8 +1506,6 @@ struct DqnMemStack
|
|||||||
|
|
||||||
DqnMemTracker tracker; // Read: Metadata for managing ptr allocation
|
DqnMemTracker tracker; // Read: Metadata for managing ptr allocation
|
||||||
DqnMemAPI *memAPI; // Read: API used to add additional memory blocks to this stack.
|
DqnMemAPI *memAPI; // Read: API used to add additional memory blocks to this stack.
|
||||||
DqnMemAPI myTailAPI; // Read: API for data structures to allocate to the tail of the stack
|
|
||||||
DqnMemAPI myHeadAPI; // Read: API for data structures to allocate to the head of the stack
|
|
||||||
Block *block; // Read: Memory block allocated for the stack
|
Block *block; // Read: Memory block allocated for the stack
|
||||||
u32 flags; // Read
|
u32 flags; // Read
|
||||||
i32 tempRegionCount; // Read: The number of temp memory regions in use
|
i32 tempRegionCount; // Read: The number of temp memory regions in use
|
||||||
@ -2379,13 +2379,15 @@ struct DqnFileInfo
|
|||||||
// NOTE: You want size + 1 and add the null-terminator yourself if you want a null terminated buffer.
|
// NOTE: You want size + 1 and add the null-terminator yourself if you want a null terminated buffer.
|
||||||
// bytesRead: Pass in to get how many bytes of the buf was used. Basically the return value of Read
|
// bytesRead: Pass in to get how many bytes of the buf was used. Basically the return value of Read
|
||||||
// return: False if insufficient bufSize OR file access failure OR nullptr arguments.
|
// return: False if insufficient bufSize OR file access failure OR nullptr arguments.
|
||||||
DQN_FILE_SCOPE bool DqnFile_ReadAll(char const *path, u8 *buf, usize const bufSize, usize *bytesRead);
|
DQN_FILE_SCOPE bool DqnFile_ReadAll(char const *path, u8 *buf, usize bufSize);
|
||||||
DQN_FILE_SCOPE bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize const bufSize, usize *bytesRead);
|
DQN_FILE_SCOPE bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize bufSize);
|
||||||
|
|
||||||
// Buffer is null-terminated and should be freed when done with.
|
// Buffer is null-terminated and should be freed when done with.
|
||||||
// return: False if file access failure OR nullptr arguments.
|
// return: False if file access failure OR nullptr arguments.
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemAPI *api = DQN_DEFAULT_HEAP_ALLOCATOR);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemAPI *api = DQN_DEFAULT_HEAP_ALLOCATOR);
|
||||||
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemAPI *api = DQN_DEFAULT_HEAP_ALLOCATOR);
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemAPI *api = DQN_DEFAULT_HEAP_ALLOCATOR);
|
||||||
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemStack *stack, DqnMemStack::AllocTo allocTo = DqnMemStack::AllocTo::Head);
|
||||||
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemStack *stack, DqnMemStack::AllocTo allocTo = DqnMemStack::AllocTo::Head);
|
||||||
|
|
||||||
DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize const bufSize);
|
DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize const bufSize);
|
||||||
DQN_FILE_SCOPE bool DqnFile_WriteAll(wchar_t const *path, u8 const *buf, usize const bufSize);
|
DQN_FILE_SCOPE bool DqnFile_WriteAll(wchar_t const *path, u8 const *buf, usize const bufSize);
|
||||||
@ -2760,7 +2762,7 @@ DQN_FILE_SCOPE void DqnLog(char const *file, char const *functionName, i32 lineN
|
|||||||
char const *const formatStr = "%s:%s,%d: DqnLog: %s\n";
|
char const *const formatStr = "%s:%s,%d: DqnLog: %s\n";
|
||||||
fprintf(stderr, formatStr, file, functionName, lineNum, userMsg);
|
fprintf(stderr, formatStr, file, functionName, lineNum, userMsg);
|
||||||
|
|
||||||
#if defined(DQN_IS_WIN32)
|
#if defined(DQN_PLATFORM_IMPLEMENTATION) && defined(DQN_IS_WIN32)
|
||||||
DqnWin32_OutputDebugString(formatStr, file, functionName, lineNum, userMsg);
|
DqnWin32_OutputDebugString(formatStr, file, functionName, lineNum, userMsg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2795,7 +2797,7 @@ DQN_FILE_SCOPE void DqnLogExpr(char const *file, char const *functionName, i32 l
|
|||||||
char const *const formatStr = ":%s:%s,%d(%s): DqnLog: %s\n";
|
char const *const formatStr = ":%s:%s,%d(%s): DqnLog: %s\n";
|
||||||
fprintf(stderr, formatStr, file, functionName, lineNum, expr, userMsg);
|
fprintf(stderr, formatStr, file, functionName, lineNum, expr, userMsg);
|
||||||
|
|
||||||
#if defined(DQN_IS_WIN32)
|
#if defined(DQN_PLATFORM_IMPLEMENTATION) && defined(DQN_IS_WIN32)
|
||||||
DqnWin32_OutputDebugString(formatStr, file, functionName, lineNum, expr, userMsg);
|
DqnWin32_OutputDebugString(formatStr, file, functionName, lineNum, expr, userMsg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -3313,8 +3315,6 @@ DqnMemStack::DqnMemStack(void *mem, isize size, Dqn::ZeroClear clear, u32 flags_
|
|||||||
|
|
||||||
this->block = static_cast<DqnMemStack::Block *>(mem);
|
this->block = static_cast<DqnMemStack::Block *>(mem);
|
||||||
*this->block = Block(blockOffset, blockSize);
|
*this->block = Block(blockOffset, blockSize);
|
||||||
this->myHeadAPI = DqnMemAPI::StackAllocator(this, DqnMemAPI::StackPushType::Head);
|
|
||||||
this->myTailAPI = DqnMemAPI::StackAllocator(this, DqnMemAPI::StackPushType::Tail);
|
|
||||||
this->flags = (flags_ | Flag::NonExpandable);
|
this->flags = (flags_ | Flag::NonExpandable);
|
||||||
|
|
||||||
bool boundsGuard = Dqn_BitIsSet(this->flags, Flag::BoundsGuard);
|
bool boundsGuard = Dqn_BitIsSet(this->flags, Flag::BoundsGuard);
|
||||||
@ -3329,9 +3329,6 @@ DqnMemStack::DqnMemStack(isize size, Dqn::ZeroClear clear, u32 flags_, DqnMemAPI
|
|||||||
this->block = DqnMemStack__AllocateBlock(size, clear, api);
|
this->block = DqnMemStack__AllocateBlock(size, clear, api);
|
||||||
this->flags = flags_;
|
this->flags = flags_;
|
||||||
this->memAPI = api;
|
this->memAPI = api;
|
||||||
this->myHeadAPI = DqnMemAPI::StackAllocator(this, DqnMemAPI::StackPushType::Head);
|
|
||||||
this->myTailAPI = DqnMemAPI::StackAllocator(this, DqnMemAPI::StackPushType::Tail);
|
|
||||||
|
|
||||||
bool boundsGuard = Dqn_BitIsSet(this->flags, Flag::BoundsGuard);
|
bool boundsGuard = Dqn_BitIsSet(this->flags, Flag::BoundsGuard);
|
||||||
this->tracker.Init(boundsGuard);
|
this->tracker.Init(boundsGuard);
|
||||||
}
|
}
|
||||||
@ -3366,6 +3363,12 @@ void *DqnMemStack::Push(isize size, AllocTo allocTo, u8 alignment)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this->block && !this->memAPI) // we assume this is a zero initialised mem stack
|
||||||
|
{
|
||||||
|
this->memAPI = DQN_DEFAULT_HEAP_ALLOCATOR;
|
||||||
|
this->tracker.Init(Dqn_BitIsSet(this->flags, DqnMemStack::Flag::BoundsGuard));
|
||||||
|
}
|
||||||
|
|
||||||
isize newBlockSize = DQN_MAX(sizeToAllocate, MINIMUM_BLOCK_SIZE);
|
isize newBlockSize = DQN_MAX(sizeToAllocate, MINIMUM_BLOCK_SIZE);
|
||||||
Block *newBlock = DqnMemStack__AllocateBlock(newBlockSize, Dqn::ZeroClear::No, this->memAPI);
|
Block *newBlock = DqnMemStack__AllocateBlock(newBlockSize, Dqn::ZeroClear::No, this->memAPI);
|
||||||
newBlock->prevBlock = this->block;
|
newBlock->prevBlock = this->block;
|
||||||
@ -5727,7 +5730,7 @@ DQN_FILE_SCOPE DqnJson DqnJson_Get(char const *buf, i32 bufLen, char const *find
|
|||||||
bufLen = static_cast<int>((buf + bufLen) - tmp);
|
bufLen = static_cast<int>((buf + bufLen) - tmp);
|
||||||
buf = tmp;
|
buf = tmp;
|
||||||
|
|
||||||
bool const findStructureInGlobalScope = (findPropertyLen == 1 && (findProperty[0] == '{' || findProperty[0] == '['));
|
bool const findStructureInGlobalScope = ((findProperty[0] == '{' || findProperty[0] == '['));
|
||||||
|
|
||||||
if ((buf[0] == '{' || buf[1] == '[') && !findStructureInGlobalScope)
|
if ((buf[0] == '{' || buf[1] == '[') && !findStructureInGlobalScope)
|
||||||
{
|
{
|
||||||
@ -8005,7 +8008,7 @@ usize DqnFile::Write(u8 const *buf, usize numBytesToWrite, usize fileOffset)
|
|||||||
usize DqnFile::Read(u8 *buf, usize numBytesToRead)
|
usize DqnFile::Read(u8 *buf, usize numBytesToRead)
|
||||||
{
|
{
|
||||||
usize numBytesRead = 0;
|
usize numBytesRead = 0;
|
||||||
if (this->handle)
|
if (buf && this->handle)
|
||||||
{
|
{
|
||||||
#if defined(DQN_IS_WIN32)
|
#if defined(DQN_IS_WIN32)
|
||||||
DWORD bytesToRead = (DWORD)numBytesToRead;
|
DWORD bytesToRead = (DWORD)numBytesToRead;
|
||||||
@ -8043,21 +8046,12 @@ u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemAPI *api)
|
|||||||
// TODO(doyle): Logging
|
// TODO(doyle): Logging
|
||||||
usize requiredSize = 0;
|
usize requiredSize = 0;
|
||||||
if (!DqnFile_Size(path, &requiredSize) || requiredSize == 0)
|
if (!DqnFile_Size(path, &requiredSize) || requiredSize == 0)
|
||||||
{
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
auto *buf = (u8 *)api->Alloc(requiredSize, Dqn::ZeroClear::No);
|
auto *buf = (u8 *)api->Alloc(requiredSize, Dqn::ZeroClear::No);
|
||||||
if (!buf)
|
if (DqnFile_ReadAll(path, buf, requiredSize))
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
usize bytesRead = 0;
|
|
||||||
if (DqnFile_ReadAll(path, buf, requiredSize, &bytesRead))
|
|
||||||
{
|
{
|
||||||
*bufSize = requiredSize;
|
*bufSize = requiredSize;
|
||||||
DQN_ASSERTM(bytesRead == requiredSize, "%zu != %zu", bytesRead, requiredSize);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8065,26 +8059,17 @@ u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemAPI *api)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemAPI *api)
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemAPI *api)
|
||||||
{
|
{
|
||||||
// TODO(doyle): Logging
|
// TODO(doyle): Logging
|
||||||
usize requiredSize = 0;
|
usize requiredSize = 0;
|
||||||
if (!DqnFile_Size(path, &requiredSize) || requiredSize == 0)
|
if (!DqnFile_Size(path, &requiredSize) || requiredSize == 0)
|
||||||
{
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
|
||||||
|
|
||||||
auto *buf = (u8 *)api->Alloc(requiredSize, Dqn::ZeroClear::No);
|
auto *buf = (u8 *)api->Alloc(requiredSize, Dqn::ZeroClear::No);
|
||||||
if (!buf)
|
if (DqnFile_ReadAll(path, buf, requiredSize))
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
usize bytesRead = 0;
|
|
||||||
if (DqnFile_ReadAll(path, buf, requiredSize, &bytesRead))
|
|
||||||
{
|
{
|
||||||
*bufSize = requiredSize;
|
*bufSize = requiredSize;
|
||||||
DQN_ASSERTM(bytesRead == requiredSize, "%zu != %zu", bytesRead, requiredSize);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8092,6 +8077,56 @@ u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemAPI *api)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(wchar_t const *path, usize *bufSize, DqnMemStack *stack, DqnMemStack::AllocTo allocTo)
|
||||||
|
{
|
||||||
|
u8 *result = nullptr;
|
||||||
|
DqnFile file = {};
|
||||||
|
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
||||||
|
{
|
||||||
|
DQN_LOGE("Could not open file: %s", path);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
DQN_DEFER(file.Close());
|
||||||
|
|
||||||
|
result = static_cast<u8 *>(stack->Push(file.size, allocTo));
|
||||||
|
usize bytesRead = file.Read(result, file.size);
|
||||||
|
if (bytesRead == file.size)
|
||||||
|
{
|
||||||
|
*bufSize = file.size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DQN_LOGE("bytesRead != file.size", bytesRead, file.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
DQN_FILE_SCOPE u8 *DqnFile_ReadAll(char const *path, usize *bufSize, DqnMemStack *stack, DqnMemStack::AllocTo allocTo)
|
||||||
|
{
|
||||||
|
u8 *result = nullptr;
|
||||||
|
DqnFile file = {};
|
||||||
|
if (!file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly))
|
||||||
|
{
|
||||||
|
DQN_LOGE("Could not open file: %s", path);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
DQN_DEFER(file.Close());
|
||||||
|
|
||||||
|
result = static_cast<u8 *>(stack->Push(file.size, allocTo));
|
||||||
|
usize bytesRead = file.Read(result, file.size);
|
||||||
|
if (bytesRead == file.size)
|
||||||
|
{
|
||||||
|
*bufSize = file.size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DQN_LOGE("bytesRead != file.size", bytesRead, file.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize const bufSize)
|
DQN_FILE_SCOPE bool DqnFile_WriteAll(char const *path, u8 const *buf, usize const bufSize)
|
||||||
{
|
{
|
||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
@ -8132,7 +8167,7 @@ DQN_FILE_SCOPE bool DqnFile_WriteAll(wchar_t const *path, u8 const *buf, usize c
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize bufSize, usize *bytesRead)
|
DQN_FILE_SCOPE bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize bufSize)
|
||||||
{
|
{
|
||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
bool result = file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly);
|
bool result = file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly);
|
||||||
@ -8145,12 +8180,12 @@ bool DqnFile_ReadAll(wchar_t const *path, u8 *buf, usize bufSize, usize *bytesRe
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*bytesRead = file.Read(buf, file.size);
|
usize bytesRead = file.Read(buf, file.size);
|
||||||
DQN_ASSERT(*bytesRead == file.size);
|
DQN_ASSERT(bytesRead == file.size);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DqnFile_ReadAll(const char *path, u8 *buf, usize bufSize, usize *bytesRead)
|
DQN_FILE_SCOPE bool DqnFile_ReadAll(char const *path, u8 *buf, usize bufSize)
|
||||||
{
|
{
|
||||||
DqnFile file = {};
|
DqnFile file = {};
|
||||||
bool result = file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly);
|
bool result = file.Open(path, DqnFile::Flag::FileRead, DqnFile::Action::OpenOnly);
|
||||||
@ -8161,8 +8196,8 @@ bool DqnFile_ReadAll(const char *path, u8 *buf, usize bufSize, usize *bytesRead)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*bytesRead = file.Read(buf, file.size);
|
usize bytesRead = file.Read(buf, file.size);
|
||||||
DQN_ASSERTM(*bytesRead == file.size, "%zu != %zu", *bytesRead, file.size);
|
DQN_ASSERTM(bytesRead == file.size, "%zu != %zu", bytesRead, file.size);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user