Finds an element by its rank. The rank argument needs to be 1-based. */
| 497 | |
| 498 | /* Finds an element by its rank. The rank argument needs to be 1-based. */ |
| 499 | zskiplistNode* zslGetElementByRank(zskiplist *zsl, unsigned long rank) { |
| 500 | zskiplistNode *x; |
| 501 | unsigned long traversed = 0; |
| 502 | int i; |
| 503 | |
| 504 | x = zsl->header; |
| 505 | for (i = zsl->level-1; i >= 0; i--) { |
| 506 | while (x->level(i)->forward && (traversed + x->level(i)->span) <= rank) |
| 507 | { |
| 508 | traversed += x->level(i)->span; |
| 509 | x = x->level(i)->forward; |
| 510 | } |
| 511 | if (traversed == rank) { |
| 512 | return x; |
| 513 | } |
| 514 | } |
| 515 | return NULL; |
| 516 | } |
| 517 | |
| 518 | /* Populate the rangespec according to the objects min and max. */ |
| 519 | static int zslParseRange(robj *min, robj *max, zrangespec *spec) { |
no test coverage detected