diff options
Diffstat (limited to 'libs/JSystem/JGadget/std-vector.cpp')
| -rw-r--r-- | libs/JSystem/JGadget/std-vector.cpp | 219 |
1 files changed, 180 insertions, 39 deletions
diff --git a/libs/JSystem/JGadget/std-vector.cpp b/libs/JSystem/JGadget/std-vector.cpp index ccca33afe2..9f88dfb221 100644 --- a/libs/JSystem/JGadget/std-vector.cpp +++ b/libs/JSystem/JGadget/std-vector.cpp @@ -5,6 +5,8 @@ #include "JSystem/JGadget/std-vector.h" #include "dolphin/types.h" +#include "algorithm.h" +#include "msl_memory.h" // // Types: @@ -12,23 +14,170 @@ namespace JGadget { struct vector { - /* 802DCCC8 */ void extend_default(u32, u32, u32); + /* 802DCCC8 */ static u32 extend_default(u32, u32, u32); }; -template <typename A1> -struct TAllocator {}; +template <typename T> +struct TAllocator { + void destroy(T* item) {} + void deallocate(T* mem, u32 size) { + DeallocateRaw(mem); + } + void DeallocateRaw(T* mem) { + delete mem; + } + T* allocate(u32 count, void *param_2) { + return AllocateRaw(count * sizeof(T)); + } + T* AllocateRaw(u32 size) { + return (T*)new char[size]; + } + + u8 field_0x0; +}; /* TAllocator<void*> */ struct TAllocator__template0 {}; -struct TVector_pointer_void { - /* 802DCCD0 */ TVector_pointer_void(JGadget::TAllocator<void*> const&); - /* 802DCCFC */ ~TVector_pointer_void(); - /* 802DCDA4 */ void insert(void**, void* const&); - /* 802DCDC4 */ void erase(void**, void**); -}; +typedef u32 (*extendFunc)(u32, u32, u32); + +template <typename T, typename Allocator = JGadget::TAllocator<T> > +struct TVector { + struct TDestructed_deallocate_ { + TDestructed_deallocate_(Allocator* allocator, T* addr) { + mAllocator = allocator; + mAddr = addr; + } + void set(T* addr) { + mAddr = addr; + } + inline ~TDestructed_deallocate_() { + mAllocator->deallocate(mAddr, 0); + } + Allocator* mAllocator; + T* mAddr; + }; + + TVector(Allocator const& param_0) { + field_0x0 = param_0; + pBegin_ = NULL; + pEnd_ = pBegin_; + mCapacity = 0; + pfnExtend_ = JGadget::vector::extend_default; + } + + ~TVector() { + clear(); + field_0x0.deallocate(pBegin_, 0); + } + + T* insert(T* pos, const T& val) { + u32 diff = (u32)pos - (u32)begin(); + insert(pos, 1, val); + return pBegin_ + diff; + } + + void insert(T* pos, u32 count, const T& val) { + if (count != 0) { + T* this_00 = Insert_raw(pos, count); + if (this_00 != end()) { + std::uninitialized_fill_n(this_00, count, val); + } + } + } + + T* Insert_raw(T* pos, u32 count) { + if (count == 0) { + return pos; + } + if (mCapacity < count + size()) { + u32 uVar4 = GetSize_extend_(count); + T* ppvVar5 = field_0x0.allocate(uVar4, NULL); + if (ppvVar5 == NULL) { + pos = end(); + } else { + TDestructed_deallocate_ aTStack_30(&field_0x0, ppvVar5); + T* ppvVar6 = std::uninitialized_copy(pBegin_, pos, ppvVar5); + std::uninitialized_copy(pos, pEnd_, ppvVar6 + count); + DestroyElement_all_(); + aTStack_30.set(pBegin_); + u32 uVar2 = (u32)pEnd_ - (u32)pBegin_; + pEnd_ = ppvVar5 + count + (uVar2 / 4); + pBegin_ = ppvVar5; + mCapacity = uVar4; + pos = ppvVar6; + } + } else { + T* ppvVar5 = pos + count; + if (ppvVar5 < pEnd_) { + T* ppvVar6 = pEnd_ - count; + std::uninitialized_copy(ppvVar6, pEnd_, pEnd_); + std::copy_backward(pos, ppvVar6, pEnd_); + DestroyElement_(pos, ppvVar5); + pEnd_ += count; + } else { + std::uninitialized_copy(pos, pEnd_, ppvVar5); + DestroyElement_(pos, pEnd_); + pEnd_ += count; + } + } + return pos; + } -template <typename A1, typename B1> -struct TVector {}; + T* begin() { + return pBegin_; + } + + T* end() { + return pEnd_; + } + + u32 size() { + if (pBegin_ == 0) { + return 0; + } + return ((u32)pEnd_ - (u32)pBegin_) / 4; + } + + u32 capacity() { return mCapacity; } + + u32 GetSize_extend_(u32 count) { + u32 iVar2 = size(); + u32 uVar3 = capacity(); + u32 uVar4 = pfnExtend_(uVar3, iVar2, count); + if (uVar4 < iVar2 + count) { + uVar4 = iVar2 + count; + } + return uVar4; + } + + void DestroyElement_(T* start, T* end) { + for (; start != end; start++) { + field_0x0.destroy(start); + } + } + + void DestroyElement_all_() { + DestroyElement_(pBegin_, pEnd_); + } + + T* erase(T* start, T* end) { + T* vectorEnd = pEnd_; + T* ppvVar3 = std::copy(end, vectorEnd, start); + DestroyElement_(ppvVar3, pEnd_); + pEnd_ = ppvVar3; + return start; + } + + void clear() { + erase(begin(), end()); + } + + Allocator field_0x0; + T* pBegin_; + T* pEnd_; + u32 mCapacity; + extendFunc pfnExtend_; +}; /* TVector<void*, JGadget::TAllocator<void*>> */ struct TVector__template0 { /* 802DD130 */ void func_802DD130(void* _this, void**, void* const&); @@ -36,6 +185,13 @@ struct TVector__template0 { /* 802DCE8C */ void func_802DCE8C(void* _this, void**, u32); }; +struct TVector_pointer_void : public TVector<void*> { + /* 802DCCD0 */ TVector_pointer_void(JGadget::TAllocator<void*> const&); + /* 802DCCFC */ ~TVector_pointer_void(); + /* 802DCDA4 */ void insert(void**, void* const&); + /* 802DCDC4 */ void** erase(void**, void**); +}; + }; // namespace JGadget // @@ -67,38 +223,27 @@ extern "C" void _restgpr_29(); // /* 802DCCC8-802DCCD0 2D7608 0008+00 1/1 0/0 0/0 .text extend_default__Q27JGadget6vectorFUlUlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JGadget::vector::extend_default(u32 param_0, u32 param_1, u32 param_2) { - nofralloc -#include "asm/JSystem/JGadget/std-vector/extend_default__Q27JGadget6vectorFUlUlUl.s" +u32 JGadget::vector::extend_default(u32 param_0, u32 param_1, u32 param_2) { + return param_1 << 1; } -#pragma pop /* 802DCCD0-802DCCFC 2D7610 002C+00 0/0 1/1 0/0 .text * __ct__Q27JGadget20TVector_pointer_voidFRCQ27JGadget14TAllocator<Pv> */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JGadget::TVector_pointer_void::TVector_pointer_void(JGadget::TAllocator<void*> const& param_0) { - nofralloc -#include "asm/JSystem/JGadget/std-vector/func_802DCCD0.s" +JGadget::TVector_pointer_void::TVector_pointer_void(JGadget::TAllocator<void*> const& param_0) : TVector<void*>(param_0) { } -#pragma pop /* 802DCCFC-802DCDA4 2D763C 00A8+00 0/0 2/2 0/0 .text __dt__Q27JGadget20TVector_pointer_voidFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JGadget::TVector_pointer_void::~TVector_pointer_void() { - nofralloc -#include "asm/JSystem/JGadget/std-vector/__dt__Q27JGadget20TVector_pointer_voidFv.s" +JGadget::TVector_pointer_void::~TVector_pointer_void() { } -#pragma pop /* 802DCDA4-802DCDC4 2D76E4 0020+00 0/0 1/1 0/0 .text * insert__Q27JGadget20TVector_pointer_voidFPPvRCPv */ +// the entire function chain needs work +#ifdef NONMATCHING +void JGadget::TVector_pointer_void::insert(void** param_0, void* const& param_1) { + TVector<void*>::insert(param_0, param_1); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -107,17 +252,13 @@ asm void JGadget::TVector_pointer_void::insert(void** param_0, void* const& para #include "asm/JSystem/JGadget/std-vector/insert__Q27JGadget20TVector_pointer_voidFPPvRCPv.s" } #pragma pop +#endif /* 802DCDC4-802DCE1C 2D7704 0058+00 0/0 1/1 0/0 .text * erase__Q27JGadget20TVector_pointer_voidFPPvPPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JGadget::TVector_pointer_void::erase(void** param_0, void** param_1) { - nofralloc -#include "asm/JSystem/JGadget/std-vector/erase__Q27JGadget20TVector_pointer_voidFPPvPPv.s" +void** JGadget::TVector_pointer_void::erase(void** param_0, void** param_1) { + return TVector<void*>::erase(param_0, param_1); } -#pragma pop /* 802DCE1C-802DCE8C 2D775C 0070+00 1/1 0/0 0/0 .text * insert__Q27JGadget38TVector<Pv,Q27JGadget14TAllocator<Pv>>FPPvUlRCPv */ |
