Files
tp/include/JSystem/JGadget/linklist.h
T

179 lines
5.3 KiB
C++
Raw Normal View History

2021-03-28 22:49:05 +02:00
#ifndef LINKLIST_H
#define LINKLIST_H
2021-01-05 09:47:26 -08:00
#include "dolphin/types.h"
namespace JGadget {
struct TLinkListNode {
2021-09-27 15:27:58 -07:00
TLinkListNode() {
mNext = NULL;
mPrev = NULL;
}
2023-08-06 06:12:26 +03:00
TLinkListNode* getNext() { return mNext; }
/* 0x0 */ TLinkListNode* mNext;
/* 0x4 */ TLinkListNode* mPrev;
}; // Size: 0x8
struct TNodeLinkList {
2021-09-27 15:27:58 -07:00
struct iterator {
iterator(TLinkListNode* pNode) { node = pNode; }
iterator(const iterator& iter) { *this = iter; }
2023-08-06 06:12:26 +03:00
iterator& operator++() {
node = node->getNext();
return *this;
}
2021-09-27 15:27:58 -07:00
TLinkListNode* node;
};
2023-02-19 09:40:57 -08:00
struct const_iterator {
const_iterator(TLinkListNode* pNode) { node = pNode; }
const_iterator(const const_iterator& iter) { *this = iter; }
2023-10-01 00:24:19 +03:00
const_iterator(iterator iter) { *this = iter; }
TLinkListNode* operator->() const { return node; }
const_iterator& operator++() {
node = node->getNext();
return *this;
}
2023-02-19 09:40:57 -08:00
TLinkListNode* node;
};
2021-11-26 06:50:22 -08:00
TNodeLinkList() : ocObject_() { Initialize_(); }
2023-02-19 09:40:57 -08:00
2021-09-27 15:27:58 -07:00
void Initialize_() {
2022-07-11 12:44:01 -07:00
count = 0;
2021-11-26 06:50:22 -08:00
ocObject_.mNext = &ocObject_;
ocObject_.mPrev = &ocObject_;
2021-09-27 15:27:58 -07:00
}
iterator end() {
2021-11-26 06:50:22 -08:00
iterator iter(&ocObject_);
2021-09-27 15:27:58 -07:00
return iter;
}
2023-02-19 09:40:57 -08:00
iterator begin() {
iterator iter(ocObject_.mNext);
return iter;
}
/* 802DCA1C */ ~TNodeLinkList();
2022-07-11 12:44:01 -07:00
/* 802DCAA0 */ iterator erase(JGadget::TNodeLinkList::iterator, JGadget::TNodeLinkList::iterator);
/* 802DCA58 */ iterator erase(JGadget::TNodeLinkList::iterator);
/* 802DCB08 */ void splice(JGadget::TNodeLinkList::iterator, JGadget::TNodeLinkList&,
JGadget::TNodeLinkList::iterator);
2022-07-11 12:44:01 -07:00
/* 802DCBA8 */ iterator Insert(JGadget::TNodeLinkList::iterator, JGadget::TLinkListNode*);
2021-11-26 06:50:22 -08:00
/* 802DCBD4 */ iterator Erase(JGadget::TLinkListNode*);
/* 802DCBF8 */ void Remove(JGadget::TLinkListNode*);
2021-09-27 15:27:58 -07:00
2022-07-11 12:44:01 -07:00
/* 0x00 */ int count;
2021-11-26 06:50:22 -08:00
/* 0x04 */ TLinkListNode ocObject_;
2021-09-27 15:27:58 -07:00
}; // Size: 0xC
template <typename T, int I>
struct TLinkList : public TNodeLinkList {
TLinkList() : TNodeLinkList() {}
struct iterator : TNodeLinkList::iterator {
iterator(TNodeLinkList::iterator iter) : TNodeLinkList::iterator(iter) {}
};
2023-10-01 00:24:19 +03:00
struct const_iterator : TNodeLinkList::const_iterator {
const_iterator(TNodeLinkList::const_iterator iter) : TNodeLinkList::const_iterator(iter) {}
const_iterator(iterator iter) : TNodeLinkList::const_iterator(iter) {}
const T* operator->() const {
return Element_toValue(TNodeLinkList::const_iterator::operator->());
}
const T& operator*() const { return *operator->();}
const_iterator& operator++() {
TNodeLinkList::const_iterator::operator++();
return *this;
}
};
2021-09-27 15:57:11 -07:00
2023-10-01 00:24:19 +03:00
TLinkListNode* Element_toNode(T* element) const { return &element->ocObject_; }
static T* Element_toValue(TLinkListNode* node) { return (T*)node; }
iterator Insert(TLinkList::iterator iter, T* element) {
2021-09-27 15:27:58 -07:00
TLinkListNode* node = Element_toNode(element);
2023-10-01 00:24:19 +03:00
return TNodeLinkList::Insert(iter, node);
2021-09-27 15:27:58 -07:00
}
2021-11-26 06:50:22 -08:00
iterator Erase(T* element) {
TLinkListNode* node = Element_toNode(element);
return ((TNodeLinkList*)this)->Erase(node);
}
2021-09-27 15:27:58 -07:00
TLinkList::iterator end() {
TNodeLinkList::iterator node_iter = TNodeLinkList::end();
TLinkList::iterator iter(node_iter);
return iter;
}
2023-10-01 00:24:19 +03:00
TLinkList::const_iterator end() const {
return TLinkList::const_iterator(((TLinkList*)this)->end());
}
2023-02-19 09:40:57 -08:00
TLinkList::iterator begin() {
TNodeLinkList::iterator node_iter = TNodeLinkList::begin();
TLinkList::iterator iter(node_iter);
return iter;
}
2023-10-01 00:24:19 +03:00
TLinkList::const_iterator begin() const {
return TLinkList::const_iterator(((TLinkList*)this)->begin());
}
2021-09-27 15:27:58 -07:00
void Push_back(T* element) {
TLinkList::iterator iter(TLinkList::end());
this->Insert(iter, element);
}
};
2023-10-01 00:24:19 +03:00
template<typename T, int I>
bool operator==(const typename TLinkList<T, I>::const_iterator iter1, const typename TLinkList<T, I>::const_iterator iter2) {
return iter1->node == iter2->node;
}
template<typename T, int I>
bool operator!=(const typename TLinkList<T, I>::const_iterator iter1, const typename TLinkList<T, I>::const_iterator iter2) {
return !(iter1 == iter2);
}
2023-02-19 09:40:57 -08:00
template <typename T, int I>
struct TLinkList_factory : public TLinkList<T, I> {
virtual ~TLinkList_factory() {}
virtual T* Do_create() = 0;
virtual void Do_destroy(T*) = 0;
};
template <typename T, int I>
struct TEnumerator {
2023-10-01 00:24:19 +03:00
inline TEnumerator(typename TLinkList<T,I>::const_iterator _current, typename TLinkList<T,I>::const_iterator _end) :
current(_current), end(_end)
{}
bool isEnd() const { return current.node == end.node; }
operator bool() const { return isEnd(); }
T& operator*() {
T& rv = (T&)*current;
++current;
return rv;
}
TLinkList<T, I>::const_iterator current;
TLinkList<T, I>::const_iterator end;
2023-02-19 09:40:57 -08:00
};
template <typename T, int I>
2023-10-01 00:24:19 +03:00
struct TContainerEnumerator_const : public TEnumerator<T, I> {
inline TContainerEnumerator_const(const T* param_0) : TEnumerator<T,I>(param_0->begin(), param_0->end())
{}
};
2023-02-19 09:40:57 -08:00
}; // namespace JGadget
2021-03-28 22:49:05 +02:00
#endif /* LINKLIST_H */