summaryrefslogtreecommitdiff
path: root/libs/JSystem/JGadget/std-vector.cpp
diff options
context:
space:
mode:
authorhatal175 <hatal175@users.noreply.github.com>2024-01-11 01:16:40 +0200
committerGitHub <noreply@github.com>2024-01-11 01:16:40 +0200
commitf342bd71716619832c47eea7e90f57d106cd6b63 (patch)
tree01deaad96b0460180739743609186efd1c6f5589 /libs/JSystem/JGadget/std-vector.cpp
parent99f0efe97501b8dc17343fdf9ff1e46f835a766d (diff)
Import JASCmdStack, std-vector work, Z2StatusMgr OK (#2029)
* Import JASCmdStack * Work on std-vector * Z2StatusMgr OK
Diffstat (limited to 'libs/JSystem/JGadget/std-vector.cpp')
-rw-r--r--libs/JSystem/JGadget/std-vector.cpp219
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 */