*optimized cached list accessing.
This commit is contained in:
parent
9ad0a75148
commit
c1705c6a54
1
HISTORY
1
HISTORY
@ -1,5 +1,6 @@
|
|||||||
Jan. 26 2016
|
Jan. 26 2016
|
||||||
Added source file information to stepped handler
|
Added source file information to stepped handler
|
||||||
|
Optimized cached list accessing
|
||||||
|
|
||||||
Jan. 25 2016
|
Jan. 25 2016
|
||||||
Fixed a memory leak when printing a referenced usertype
|
Fixed a memory leak when printing a referenced usertype
|
||||||
|
@ -6093,30 +6093,63 @@ _ls_node_t* _node_at_list(_list_t* coll, int index) {
|
|||||||
/* Get a node in a list with a specific index */
|
/* Get a node in a list with a specific index */
|
||||||
_ls_node_t* result = 0;
|
_ls_node_t* result = 0;
|
||||||
_ls_node_t* tmp = 0;
|
_ls_node_t* tmp = 0;
|
||||||
int idx = index;
|
int n = 0;
|
||||||
|
|
||||||
mb_assert(coll);
|
mb_assert(coll);
|
||||||
|
|
||||||
_fill_ranged(coll);
|
_fill_ranged(coll);
|
||||||
|
|
||||||
/* TODO: Optimize me */
|
|
||||||
if(index >= 0 && index < (int)coll->count) {
|
if(index >= 0 && index < (int)coll->count) {
|
||||||
if(coll->cached_node && !(index < coll->cached_index / 2)) {
|
/* HEAD ... LEFT ... PIVOT ... RIGHT ... TAIL */
|
||||||
while(index != coll->cached_index) {
|
int head = 0,
|
||||||
if(index > coll->cached_index) {
|
left = coll->cached_index / 2,
|
||||||
coll->cached_node = coll->cached_node->next;
|
right = coll->cached_index + (coll->count - coll->cached_index) / 2,
|
||||||
coll->cached_index++;
|
tail = coll->count - 1;
|
||||||
} else if(index < coll->cached_index) {
|
if(coll->cached_node) {
|
||||||
coll->cached_node = coll->cached_node->prev;
|
if(index >= head && index < left) { /* [HEAD, LEFT) */
|
||||||
coll->cached_index--;
|
n = index;
|
||||||
|
tmp = coll->list->next;
|
||||||
|
while(tmp && n) {
|
||||||
|
tmp = tmp->next;
|
||||||
|
--n;
|
||||||
}
|
}
|
||||||
|
if(tmp) {
|
||||||
|
result = tmp;
|
||||||
|
coll->cached_node = tmp;
|
||||||
|
coll->cached_index = index;
|
||||||
|
}
|
||||||
|
} else if(index >= left && index <= right) { /* [LEFT, RIGHT] */
|
||||||
|
while(index != coll->cached_index) {
|
||||||
|
if(index > coll->cached_index) {
|
||||||
|
coll->cached_node = coll->cached_node->next;
|
||||||
|
coll->cached_index++;
|
||||||
|
} else if(index < coll->cached_index) {
|
||||||
|
coll->cached_node = coll->cached_node->prev;
|
||||||
|
coll->cached_index--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = coll->cached_node;
|
||||||
|
} else if(index > right && index <= tail) { /* (RIGHT, TAIL] */
|
||||||
|
n = tail - index;
|
||||||
|
tmp = coll->list->prev;
|
||||||
|
while(tmp && n) {
|
||||||
|
tmp = tmp->prev;
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
if(tmp) {
|
||||||
|
result = tmp;
|
||||||
|
coll->cached_node = tmp;
|
||||||
|
coll->cached_index = index;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mb_assert(0 && "Impossible.");
|
||||||
}
|
}
|
||||||
result = coll->cached_node;
|
|
||||||
} else {
|
} else {
|
||||||
|
n = index;
|
||||||
tmp = coll->list->next;
|
tmp = coll->list->next;
|
||||||
while(tmp && idx) {
|
while(tmp && n) {
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
--idx;
|
--n;
|
||||||
}
|
}
|
||||||
if(tmp) {
|
if(tmp) {
|
||||||
result = tmp;
|
result = tmp;
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user