Fix array off by 1 in remove/get
This commit is contained in:
parent
7e996981d6
commit
0468024f35
61
dqn.h
61
dqn.h
@ -235,7 +235,7 @@ public:
|
||||
{
|
||||
struct Alloc_
|
||||
{
|
||||
bool clearToZero;
|
||||
bool zeroClear;
|
||||
size_t requestSize;
|
||||
} alloc;
|
||||
|
||||
@ -269,7 +269,7 @@ public:
|
||||
static DqnMemAPI StackAllocator(struct DqnMemStack *const stack);
|
||||
|
||||
void *Realloc(void *const oldPtr, size_t const oldSize, size_t const newSize);
|
||||
void *Alloc (size_t const size, bool const clearToZero = true);
|
||||
void *Alloc (size_t const size, bool const zeroClear = true);
|
||||
void Free (void *const ptrToFree, size_t const sizeToFree);
|
||||
bool IsValid() const { return (this->allocator != nullptr); }
|
||||
};
|
||||
@ -348,7 +348,7 @@ struct DqnMemStack
|
||||
|
||||
// Initialisation API
|
||||
// =============================================================================================
|
||||
// Uses fixed buffer, allocations will be soruced from the buffer and fail after buffer is full.
|
||||
// Uses fixed buffer, allocations will be sourced from the buffer and fail after buffer is full.
|
||||
// stack: A pointer to a zero cleared struct.
|
||||
// mem: Memory to use for the memory stack
|
||||
// byteAlign: Set the alignment of memory addresses for all allocated items from the memory stack.
|
||||
@ -517,19 +517,19 @@ public:
|
||||
T &operator[](i32 x) { return this->data[x]; }
|
||||
|
||||
// API
|
||||
bool Init (const i64 size, DqnMemStack *const stack);
|
||||
bool Init (const i64 size, DqnMemAPI *const api = &DQN_DEFAULT_HEAP_ALLOCATOR);
|
||||
bool Init (i64 const size, DqnMemStack *const stack);
|
||||
bool Init (i64 const size, DqnMemAPI *const api = &DQN_DEFAULT_HEAP_ALLOCATOR);
|
||||
bool Free ();
|
||||
bool Resize (const i64 newMax);
|
||||
bool Resize (i64 const newMax);
|
||||
bool Grow ();
|
||||
T *Push (const T *item, const i64 num);
|
||||
T *Push (const T item);
|
||||
T *Insert (const T item, i64 index);
|
||||
T *Push (T const *item, i64 const num);
|
||||
T *Push (T const item);
|
||||
T *Insert (T const item, i64 index);
|
||||
void Pop ();
|
||||
T *Get (const i64 index);
|
||||
void Clear (const bool clearMemory = false);
|
||||
bool Remove (const i64 index);
|
||||
bool RemoveStable(const i64 index);
|
||||
T *Get (i64 const index);
|
||||
void Clear (bool const zeroClear = false);
|
||||
bool Remove (i64 const index);
|
||||
bool RemoveStable(i64 const index);
|
||||
void RemoveStable(i64 *indexList, const i64 numIndexes);
|
||||
};
|
||||
|
||||
@ -710,22 +710,21 @@ T *DqnArray<T>::Insert(const T item, i64 index)
|
||||
template <typename T>
|
||||
void DqnArray<T>::Pop()
|
||||
{
|
||||
if (this->count == 0) return;
|
||||
this->count--;
|
||||
this->Remove(this->count - 1);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *DqnArray<T>::Get(const i64 index)
|
||||
T *DqnArray<T>::Get(i64 const index)
|
||||
{
|
||||
T *result = nullptr;
|
||||
if (index >= 0 && index <= this->count) result = &this->data[index];
|
||||
if (index >= 0 && index < this->count) result = &this->data[index];
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void DqnArray<T>::Clear(bool clearMemory)
|
||||
void DqnArray<T>::Clear(bool const zeroClear)
|
||||
{
|
||||
if (clearMemory)
|
||||
if (zeroClear)
|
||||
{
|
||||
i64 sizeToClear = sizeof(T) * this->count;
|
||||
DqnMem_Clear(this->data, 0, sizeToClear);
|
||||
@ -734,9 +733,9 @@ void DqnArray<T>::Clear(bool clearMemory)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool DqnArray<T>::Remove(const i64 index)
|
||||
bool DqnArray<T>::Remove(i64 const index)
|
||||
{
|
||||
if (index >= this->count) return false;
|
||||
if (index >= this->count || index < 0) return false;
|
||||
|
||||
bool firstElementAndOnlyElement = (index == 0 && this->count == 1);
|
||||
bool isLastElement = (index == (this->count - 1));
|
||||
@ -752,9 +751,9 @@ bool DqnArray<T>::Remove(const i64 index)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool DqnArray<T>::RemoveStable(const i64 index)
|
||||
bool DqnArray<T>::RemoveStable(i64 const index)
|
||||
{
|
||||
if (index >= this->count) return false;
|
||||
if (index >= this->count || index < 0) return false;
|
||||
|
||||
bool firstElementAndOnlyElement = (index == 0 && this->count == 1);
|
||||
bool isLastElement = (index == (this->count - 1));
|
||||
@ -2936,8 +2935,8 @@ FILE_SCOPE u8 *DqnMemAPIInternal_HeapAllocatorCallback(DqnMemAPI *api, DqnMemAPI
|
||||
{
|
||||
auto const *request = &request_.alloc;
|
||||
|
||||
if (request->clearToZero) result = (u8 *)DqnMem_Calloc(request->requestSize);
|
||||
else result = (u8 *)DqnMem_Alloc(request->requestSize);
|
||||
if (request->zeroClear) result = (u8 *)DqnMem_Calloc(request->requestSize);
|
||||
else result = (u8 *)DqnMem_Alloc(request->requestSize);
|
||||
|
||||
success = (result != nullptr);
|
||||
}
|
||||
@ -2995,7 +2994,7 @@ FILE_SCOPE u8 *DqnMemAPIInternal_StackAllocatorCallback(DqnMemAPI *api, DqnMemAP
|
||||
if (result)
|
||||
{
|
||||
success = true;
|
||||
if (request->clearToZero) DqnMem_Clear(result, 0, request->requestSize);
|
||||
if (request->zeroClear) DqnMem_Clear(result, 0, request->requestSize);
|
||||
}
|
||||
}
|
||||
else if (request_.type == DqnMemAPI::Type::Realloc)
|
||||
@ -3079,9 +3078,9 @@ FILE_SCOPE u8 *DqnMemAPIInternal_StackAllocatorCallback(DqnMemAPI *api, DqnMemAP
|
||||
|
||||
void *DqnMemAPI::Realloc(void *const oldPtr, size_t const oldSize, size_t const newSize)
|
||||
{
|
||||
Request request = {};
|
||||
request.type = Type::Realloc;
|
||||
request.userContext = this->userContext;
|
||||
Request request = {};
|
||||
request.type = Type::Realloc;
|
||||
request.userContext = this->userContext;
|
||||
request.realloc.newRequestSize = newSize;
|
||||
request.realloc.oldMemPtr = oldPtr;
|
||||
request.realloc.oldSize = oldSize;
|
||||
@ -3090,12 +3089,12 @@ void *DqnMemAPI::Realloc(void *const oldPtr, size_t const oldSize, size_t const
|
||||
return result;
|
||||
}
|
||||
|
||||
void *DqnMemAPI::Alloc(size_t const size, bool const clearToZero)
|
||||
void *DqnMemAPI::Alloc(size_t const size, bool const zeroClear)
|
||||
{
|
||||
Request request = {};
|
||||
request.type = Type::Alloc;
|
||||
request.userContext = this->userContext;
|
||||
request.alloc.clearToZero = clearToZero;
|
||||
request.alloc.zeroClear = zeroClear;
|
||||
request.alloc.requestSize = size;
|
||||
|
||||
void *result = (void *)this->allocator(this, request);
|
||||
|
Loading…
Reference in New Issue
Block a user