mirror of
https://github.com/zeldaret/tp
synced 2026-07-09 06:53:23 -04:00
Import JASCmdStack, std-vector work, Z2StatusMgr OK (#2029)
* Import JASCmdStack * Work on std-vector * Z2StatusMgr OK
This commit is contained in:
@@ -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 A1, typename B1>
|
||||
struct TVector {};
|
||||
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;
|
||||
}
|
||||
|
||||
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 */
|
||||
|
||||
Reference in New Issue
Block a user