mirror of
https://github.com/godotengine/godot.git
synced 2025-02-23 23:15:07 +08:00
Refactor core/set.h
This commit is contained in:
parent
e3617cb187
commit
0a1db473fb
130
core/set.h
130
core/set.h
@ -100,17 +100,15 @@ private:
|
|||||||
Element *_nil;
|
Element *_nil;
|
||||||
int size_cache;
|
int size_cache;
|
||||||
|
|
||||||
_Data() {
|
_FORCE_INLINE_ _Data() {
|
||||||
#ifdef GLOBALNIL_DISABLED
|
#ifdef GLOBALNIL_DISABLED
|
||||||
_nil = memnew_allocator(Element, A);
|
_nil = memnew_allocator(Element, A);
|
||||||
_nil->parent = _nil->left = _nil->right = _nil;
|
_nil->parent = _nil->left = _nil->right = _nil;
|
||||||
_nil->color = BLACK;
|
_nil->color = BLACK;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
_nil = (Element *)&_GlobalNilClass::_nil;
|
_nil = (Element *)&_GlobalNilClass::_nil;
|
||||||
#endif
|
#endif
|
||||||
_root = NULL;
|
_root = NULL;
|
||||||
|
|
||||||
size_cache = 0;
|
size_cache = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,6 +130,7 @@ private:
|
|||||||
~_Data() {
|
~_Data() {
|
||||||
|
|
||||||
_free_root();
|
_free_root();
|
||||||
|
|
||||||
#ifdef GLOBALNIL_DISABLED
|
#ifdef GLOBALNIL_DISABLED
|
||||||
memdelete_allocator<Element, A>(_nil);
|
memdelete_allocator<Element, A>(_nil);
|
||||||
#endif
|
#endif
|
||||||
@ -196,7 +195,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node->parent == _data._root)
|
if (node->parent == _data._root)
|
||||||
return NULL; // No successor, as p_node is the last node.
|
return NULL; // No successor, as p_node = last node
|
||||||
return node->parent;
|
return node->parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -218,7 +217,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node == _data._root)
|
if (node == _data._root)
|
||||||
return NULL; // No predecessor, as p_node is the first node.
|
return NULL; // No predecessor, as p_node = first node.
|
||||||
return node->parent;
|
return node->parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,65 +265,13 @@ private:
|
|||||||
return prev;
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
Element *_insert(const T &p_value, bool &r_exists) {
|
void _insert_rb_fix(Element *p_new_node) {
|
||||||
|
|
||||||
Element *new_parent = _data._root;
|
Element *node = p_new_node;
|
||||||
Element *node = _data._root->left;
|
|
||||||
C less;
|
|
||||||
|
|
||||||
while (node != _data._nil) {
|
|
||||||
|
|
||||||
new_parent = node;
|
|
||||||
|
|
||||||
if (less(p_value, node->value))
|
|
||||||
node = node->left;
|
|
||||||
else if (less(node->value, p_value))
|
|
||||||
node = node->right;
|
|
||||||
else {
|
|
||||||
r_exists = true;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r_exists = false;
|
|
||||||
|
|
||||||
Element *new_node = memnew_allocator(Element, A);
|
|
||||||
new_node->parent = new_parent;
|
|
||||||
new_node->right = _data._nil;
|
|
||||||
new_node->left = _data._nil;
|
|
||||||
new_node->value = p_value;
|
|
||||||
//new_node->data=_data;
|
|
||||||
|
|
||||||
if (new_parent == _data._root || less(p_value, new_parent->value)) {
|
|
||||||
new_parent->left = new_node;
|
|
||||||
} else {
|
|
||||||
new_parent->right = new_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_node->_next = _successor(new_node);
|
|
||||||
new_node->_prev = _predecessor(new_node);
|
|
||||||
if (new_node->_next)
|
|
||||||
new_node->_next->_prev = new_node;
|
|
||||||
if (new_node->_prev)
|
|
||||||
new_node->_prev->_next = new_node;
|
|
||||||
|
|
||||||
return new_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
Element *_insert_rb(const T &p_value) {
|
|
||||||
|
|
||||||
bool exists = false;
|
|
||||||
Element *new_node = _insert(p_value, exists);
|
|
||||||
if (exists)
|
|
||||||
return new_node;
|
|
||||||
|
|
||||||
_data.size_cache++;
|
|
||||||
Element *node = new_node;
|
|
||||||
Element *nparent = node->parent;
|
Element *nparent = node->parent;
|
||||||
Element *ngrand_parent;
|
Element *ngrand_parent;
|
||||||
|
|
||||||
while (nparent->color == RED) {
|
while (nparent->color == RED) {
|
||||||
|
|
||||||
ngrand_parent = nparent->parent;
|
ngrand_parent = nparent->parent;
|
||||||
|
|
||||||
if (nparent == ngrand_parent->left) {
|
if (nparent == ngrand_parent->left) {
|
||||||
@ -365,11 +312,53 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_set_color(_data._root->left, BLACK);
|
_set_color(_data._root->left, BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
Element *_insert(const T &p_value) {
|
||||||
|
|
||||||
|
Element *new_parent = _data._root;
|
||||||
|
Element *node = _data._root->left;
|
||||||
|
C less;
|
||||||
|
|
||||||
|
while (node != _data._nil) {
|
||||||
|
|
||||||
|
new_parent = node;
|
||||||
|
|
||||||
|
if (less(p_value, node->value))
|
||||||
|
node = node->left;
|
||||||
|
else if (less(node->value, p_value))
|
||||||
|
node = node->right;
|
||||||
|
else {
|
||||||
|
return node; // Return existing node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element *new_node = memnew_allocator(Element, A);
|
||||||
|
new_node->parent = new_parent;
|
||||||
|
new_node->right = _data._nil;
|
||||||
|
new_node->left = _data._nil;
|
||||||
|
new_node->value = p_value;
|
||||||
|
//new_node->data=_data;
|
||||||
|
|
||||||
|
if (new_parent == _data._root || less(p_value, new_parent->value)) {
|
||||||
|
new_parent->left = new_node;
|
||||||
|
} else {
|
||||||
|
new_parent->right = new_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_node->_next = _successor(new_node);
|
||||||
|
new_node->_prev = _predecessor(new_node);
|
||||||
|
if (new_node->_next)
|
||||||
|
new_node->_next->_prev = new_node;
|
||||||
|
if (new_node->_prev)
|
||||||
|
new_node->_prev->_next = new_node;
|
||||||
|
|
||||||
|
_data.size_cache++;
|
||||||
|
_insert_rb_fix(new_node);
|
||||||
return new_node;
|
return new_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _erase_fix(Element *p_node) {
|
void _erase_fix_rb(Element *p_node) {
|
||||||
|
|
||||||
Element *root = _data._root->left;
|
Element *root = _data._root->left;
|
||||||
Element *node = _data._nil;
|
Element *node = _data._nil;
|
||||||
@ -450,7 +439,7 @@ private:
|
|||||||
node->parent = rp->parent;
|
node->parent = rp->parent;
|
||||||
_set_color(node, BLACK);
|
_set_color(node, BLACK);
|
||||||
} else if (rp->color == BLACK && rp->parent != _data._root) {
|
} else if (rp->color == BLACK && rp->parent != _data._root) {
|
||||||
_erase_fix(sibling);
|
_erase_fix_rb(sibling);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rp != p_node) {
|
if (rp != p_node) {
|
||||||
@ -485,11 +474,12 @@ private:
|
|||||||
|
|
||||||
void _calculate_depth(Element *p_element, int &max_d, int d) const {
|
void _calculate_depth(Element *p_element, int &max_d, int d) const {
|
||||||
|
|
||||||
if (p_element == _data._nil) {
|
if (p_element == _data._nil)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
_calculate_depth(p_element->left, max_d, d + 1);
|
_calculate_depth(p_element->left, max_d, d + 1);
|
||||||
_calculate_depth(p_element->right, max_d, d + 1);
|
_calculate_depth(p_element->right, max_d, d + 1);
|
||||||
|
|
||||||
if (d > max_d)
|
if (d > max_d)
|
||||||
max_d = d;
|
max_d = d;
|
||||||
}
|
}
|
||||||
@ -533,10 +523,13 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Element *lower_bound(const T &p_value) const {
|
||||||
|
|
||||||
|
return _lower_bound(p_value);
|
||||||
|
}
|
||||||
|
|
||||||
bool has(const T &p_value) const {
|
bool has(const T &p_value) const {
|
||||||
|
|
||||||
if (!_data._root)
|
|
||||||
return false;
|
|
||||||
return find(p_value) != NULL;
|
return find(p_value) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -544,7 +537,7 @@ public:
|
|||||||
|
|
||||||
if (!_data._root)
|
if (!_data._root)
|
||||||
_data._create_root();
|
_data._create_root();
|
||||||
return _insert_rb(p_value);
|
return _insert(p_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void erase(Element *p_element) {
|
void erase(Element *p_element) {
|
||||||
@ -602,11 +595,6 @@ public:
|
|||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Element *lower_bound(const T &p_value) const {
|
|
||||||
|
|
||||||
return _lower_bound(p_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int size() const { return _data.size_cache; }
|
inline int size() const { return _data.size_cache; }
|
||||||
|
|
||||||
int calculate_depth() const {
|
int calculate_depth() const {
|
||||||
|
Loading…
Reference in New Issue
Block a user