mirror of https://github.com/zeldaret/botw.git
Havok: Implement more hkArray functions
This commit is contained in:
parent
986f12a1d8
commit
9343ed56e7
|
@ -92,6 +92,9 @@ public:
|
||||||
hkBool32 shrinkExact = false);
|
hkBool32 shrinkExact = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
HK_FORCE_INLINE hkArrayBase<T>& copyFromArray(hkMemoryAllocator& allocator,
|
||||||
|
const hkArrayBase<T>& src);
|
||||||
|
|
||||||
T* m_data;
|
T* m_data;
|
||||||
int m_size;
|
int m_size;
|
||||||
int m_capacityAndFlags;
|
int m_capacityAndFlags;
|
||||||
|
@ -240,6 +243,24 @@ inline hkBool hkArrayBase<T>::tryPushBack(const T& t) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline hkResult hkArrayBase<T>::_reserve(hkMemoryAllocator& alloc, int n) {
|
||||||
|
const int capacity = getCapacity();
|
||||||
|
if (capacity < n) {
|
||||||
|
int newCapacity = 2 * capacity;
|
||||||
|
int newSize = n < newCapacity ? newCapacity : n;
|
||||||
|
return hkArrayUtil::_reserve(alloc, this, newSize, sizeof(T));
|
||||||
|
}
|
||||||
|
return HK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline hkResult hkArrayBase<T>::_reserveExactly(hkMemoryAllocator& alloc, int n) {
|
||||||
|
if (getCapacity() < n)
|
||||||
|
return hkArrayUtil::_reserve(alloc, this, n, sizeof(T));
|
||||||
|
return HK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline typename hkArrayBase<T>::iterator hkArrayBase<T>::begin() {
|
inline typename hkArrayBase<T>::iterator hkArrayBase<T>::begin() {
|
||||||
return m_data;
|
return m_data;
|
||||||
|
@ -286,6 +307,48 @@ inline void hkArrayBase<T>::setDataUserFree(T* ptr, int size, int capacity) {
|
||||||
_setDataUnchecked(ptr, size, capacity | DONT_DEALLOCATE_FLAG);
|
_setDataUnchecked(ptr, size, capacity | DONT_DEALLOCATE_FLAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline hkArrayBase<T>& hkArrayBase<T>::copyFromArray(hkMemoryAllocator& allocator,
|
||||||
|
const hkArrayBase<T>& src) {
|
||||||
|
if constexpr (std::is_pod_v<T>) {
|
||||||
|
if (getCapacity() < src.getSize()) {
|
||||||
|
if ((m_capacityAndFlags & DONT_DEALLOCATE_FLAG) == 0) {
|
||||||
|
allocator._bufFree<T>(m_data, getCapacity());
|
||||||
|
}
|
||||||
|
const int n = src.getSize();
|
||||||
|
m_data = allocator._bufAlloc<T>(n);
|
||||||
|
m_capacityAndFlags = n;
|
||||||
|
}
|
||||||
|
m_size = src.getSize();
|
||||||
|
copy(m_data, src.m_data, m_size);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const int oldSize = m_size;
|
||||||
|
const int newSize = src.getSize();
|
||||||
|
const int copiedSize = newSize > oldSize ? oldSize : newSize;
|
||||||
|
|
||||||
|
_reserve(allocator, newSize);
|
||||||
|
hkArrayUtil::destruct(m_data + newSize, oldSize - newSize);
|
||||||
|
copy(m_data, src.m_data, copiedSize);
|
||||||
|
hkArrayUtil::constructWithArray(m_data + copiedSize, newSize - copiedSize,
|
||||||
|
src.m_data + copiedSize);
|
||||||
|
m_size = newSize;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Allocator>
|
||||||
|
inline hkArray<T, Allocator>& hkArray<T, Allocator>::operator=(const hkArrayBase<T>& a) {
|
||||||
|
this->copyFromArray(Allocator().get(), a);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Allocator>
|
||||||
|
inline hkArray<T, Allocator>& hkArray<T, Allocator>::operator=(const hkArray& a) {
|
||||||
|
this->copyFromArray(Allocator().get(), a);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, typename Allocator>
|
template <typename T, typename Allocator>
|
||||||
inline void hkArray<T, Allocator>::clearAndDeallocate() {
|
inline void hkArray<T, Allocator>::clearAndDeallocate() {
|
||||||
this->_clearAndDeallocate(AllocatorType().get());
|
this->_clearAndDeallocate(AllocatorType().get());
|
||||||
|
|
Loading…
Reference in New Issue