mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-12-22 20:06:49 +01:00
Backported goodies to SelfList from Godot4.
This commit is contained in:
parent
160374e539
commit
37e287d86d
@ -100,13 +100,78 @@ public:
|
|||||||
p_elem->_root = nullptr;
|
p_elem->_root = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
while (_first) {
|
||||||
|
remove(_first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sort() {
|
||||||
|
sort_custom<Comparator<T>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
void sort_custom() {
|
||||||
|
if (_first == _last) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelfList<T> *from = _first;
|
||||||
|
SelfList<T> *current = from;
|
||||||
|
SelfList<T> *to = from;
|
||||||
|
|
||||||
|
while (current) {
|
||||||
|
SelfList<T> *next = current->_next;
|
||||||
|
|
||||||
|
if (from != current) {
|
||||||
|
current->_prev = nullptr;
|
||||||
|
current->_next = from;
|
||||||
|
|
||||||
|
SelfList<T> *find = from;
|
||||||
|
C less;
|
||||||
|
while (find && less(*find->_self, *current->_self)) {
|
||||||
|
current->_prev = find;
|
||||||
|
current->_next = find->_next;
|
||||||
|
find = find->_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current->_prev) {
|
||||||
|
current->_prev->_next = current;
|
||||||
|
} else {
|
||||||
|
from = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current->_next) {
|
||||||
|
current->_next->_prev = current;
|
||||||
|
} else {
|
||||||
|
to = current;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
current->_prev = nullptr;
|
||||||
|
current->_next = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
current = next;
|
||||||
|
}
|
||||||
|
_first = from;
|
||||||
|
_last = to;
|
||||||
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ SelfList<T> *first() { return _first; }
|
_FORCE_INLINE_ SelfList<T> *first() { return _first; }
|
||||||
_FORCE_INLINE_ const SelfList<T> *first() const { return _first; }
|
_FORCE_INLINE_ const SelfList<T> *first() const { return _first; }
|
||||||
|
|
||||||
|
// Forbid copying, which has broken behavior.
|
||||||
|
void operator=(const List &) = delete;
|
||||||
|
|
||||||
_FORCE_INLINE_ List() {
|
_FORCE_INLINE_ List() {
|
||||||
_first = nullptr;
|
_first = nullptr;
|
||||||
_last = nullptr;
|
_last = nullptr;
|
||||||
}
|
}
|
||||||
_FORCE_INLINE_ ~List() { ERR_FAIL_COND(_first != nullptr); }
|
|
||||||
|
_FORCE_INLINE_ ~List() {
|
||||||
|
// A self list must be empty on destruction.
|
||||||
|
DEV_ASSERT(_first == nullptr);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -128,6 +193,9 @@ public:
|
|||||||
_FORCE_INLINE_ const SelfList<T> *prev() const { return _prev; }
|
_FORCE_INLINE_ const SelfList<T> *prev() const { return _prev; }
|
||||||
_FORCE_INLINE_ T *self() const { return _self; }
|
_FORCE_INLINE_ T *self() const { return _self; }
|
||||||
|
|
||||||
|
// Forbid copying, which has broken behavior.
|
||||||
|
void operator=(const SelfList<T> &) = delete;
|
||||||
|
|
||||||
_FORCE_INLINE_ SelfList(T *p_self) {
|
_FORCE_INLINE_ SelfList(T *p_self) {
|
||||||
_self = p_self;
|
_self = p_self;
|
||||||
_next = nullptr;
|
_next = nullptr;
|
||||||
|
Loading…
Reference in New Issue
Block a user