Fixes incorrect adding to last in self_list
Fixes https://github.com/godotengine/godot/issues/18052
This commit is contained in:
parent
d87307d850
commit
68dda540fd
1 changed files with 29 additions and 18 deletions
|
@ -39,6 +39,7 @@ public:
|
||||||
class List {
|
class List {
|
||||||
|
|
||||||
SelfList<T> *_first;
|
SelfList<T> *_first;
|
||||||
|
SelfList<T> *_last;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void add(SelfList<T> *p_elem) {
|
void add(SelfList<T> *p_elem) {
|
||||||
|
@ -48,47 +49,54 @@ public:
|
||||||
p_elem->_root = this;
|
p_elem->_root = this;
|
||||||
p_elem->_next = _first;
|
p_elem->_next = _first;
|
||||||
p_elem->_prev = NULL;
|
p_elem->_prev = NULL;
|
||||||
if (_first)
|
|
||||||
|
if (_first) {
|
||||||
_first->_prev = p_elem;
|
_first->_prev = p_elem;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_last = p_elem;
|
||||||
|
}
|
||||||
|
|
||||||
_first = p_elem;
|
_first = p_elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_last(SelfList<T> *p_elem) {
|
void add_last(SelfList<T> *p_elem) {
|
||||||
|
|
||||||
ERR_FAIL_COND(p_elem->_root);
|
ERR_FAIL_COND(p_elem->_root);
|
||||||
|
|
||||||
if (!_first) {
|
|
||||||
add(p_elem);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SelfList<T> *e = _first;
|
|
||||||
|
|
||||||
while (e->next()) {
|
|
||||||
e = e->next();
|
|
||||||
}
|
|
||||||
|
|
||||||
e->_next = p_elem;
|
|
||||||
p_elem->_prev = e->_next;
|
|
||||||
p_elem->_root = this;
|
p_elem->_root = this;
|
||||||
|
p_elem->_next = NULL;
|
||||||
|
p_elem->_prev = _last;
|
||||||
|
|
||||||
|
if (_last) {
|
||||||
|
_last->_next = p_elem;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_first = p_elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
_last = p_elem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove(SelfList<T> *p_elem) {
|
void remove(SelfList<T> *p_elem) {
|
||||||
|
|
||||||
ERR_FAIL_COND(p_elem->_root != this);
|
ERR_FAIL_COND(p_elem->_root != this);
|
||||||
if (p_elem->_next) {
|
if (p_elem->_next) {
|
||||||
|
|
||||||
p_elem->_next->_prev = p_elem->_prev;
|
p_elem->_next->_prev = p_elem->_prev;
|
||||||
}
|
}
|
||||||
if (p_elem->_prev) {
|
|
||||||
|
|
||||||
|
if (p_elem->_prev) {
|
||||||
p_elem->_prev->_next = p_elem->_next;
|
p_elem->_prev->_next = p_elem->_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_first == p_elem) {
|
if (_first == p_elem) {
|
||||||
|
|
||||||
_first = p_elem->_next;
|
_first = p_elem->_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_last == p_elem) {
|
||||||
|
_last = p_elem->_prev;
|
||||||
|
}
|
||||||
|
|
||||||
p_elem->_next = NULL;
|
p_elem->_next = NULL;
|
||||||
p_elem->_prev = NULL;
|
p_elem->_prev = NULL;
|
||||||
p_elem->_root = NULL;
|
p_elem->_root = NULL;
|
||||||
|
@ -96,7 +104,10 @@ public:
|
||||||
|
|
||||||
_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; }
|
||||||
_FORCE_INLINE_ List() { _first = NULL; }
|
_FORCE_INLINE_ List() {
|
||||||
|
_first = NULL;
|
||||||
|
_last = NULL;
|
||||||
|
}
|
||||||
_FORCE_INLINE_ ~List() { ERR_FAIL_COND(_first != NULL); }
|
_FORCE_INLINE_ ~List() { ERR_FAIL_COND(_first != NULL); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue