feat(array): add fixed array template

This commit is contained in:
fallenoak 2020-09-24 23:44:35 -05:00
parent 5946abcb7d
commit 23df793b34
No known key found for this signature in database
GPG key ID: 7628F8E61AEA070D
3 changed files with 75 additions and 0 deletions

View file

@ -2,5 +2,6 @@
#define STORM_ARRAY_HPP
#include "array/TSBaseArray.hpp"
#include "array/TSFixedArray.hpp"
#endif

View file

@ -0,0 +1,67 @@
#ifndef STORM_ARRAY_TS_FIXED_ARRAY_HPP
#define STORM_ARRAY_TS_FIXED_ARRAY_HPP
#include "array/TSBaseArray.hpp"
#include "Memory.hpp"
#include <cstdint>
template<class T>
class TSFixedArray : public TSBaseArray<T> {
public:
void ReallocData(uint32_t count);
void SetCount(uint32_t count);
};
template<class T>
void TSFixedArray<T>::ReallocData(uint32_t count) {
T* oldData = this->m_data;
if (count < this->m_count) {
for (int32_t i = count; i < this->m_count; i++) {
T* element = &this->m_data[i];
delete element;
}
}
this->m_alloc = count;
void* v6 = SMemReAlloc(oldData, sizeof(T) * count, nullptr, 0, 0x10);
this->m_data = (T*)v6;
if (!v6) {
this->m_data = (T*)SMemAlloc(sizeof(T) * count, nullptr, 0, 0x0);
if (oldData) {
uint32_t smallestCount = count >= this->m_count ? this->m_count : count;
for (int32_t i = 0; i < smallestCount; i++) {
T* v8 = &this->m_data[i];
if (v8) {
*v8 = oldData[i];
}
}
SMemFree(oldData, nullptr, 0, 0x0);
}
}
}
template<class T>
void TSFixedArray<T>::SetCount(uint32_t count) {
if (count != this->m_count) {
if (count) {
this->ReallocData(count);
for (int32_t i = this->m_count; i < count; i++) {
new (&this->m_data[i]) T();
}
this->m_count = count;
} else {
this->Clear();
}
}
}
#endif