Data-SortedSet-Shared
view release on metacpan or search on metacpan
if (rc == -2) croak("incr: result is NaN");
RETVAL = out;
OUTPUT:
RETVAL
void
pop_min(self)
SV *self
PREINIT:
EXTRACT(self);
PPCODE:
{
int64_t m; double s; int ok;
ss_rwlock_wrlock(h);
ok = ss_pop_locked(h, 0, &m, &s);
if (ok) __atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
ss_rwlock_wrunlock(h);
if (ok) { EXTEND(SP, 2); PUSHs(sv_2mortal(newSViv((IV)m))); PUSHs(sv_2mortal(newSVnv(s))); }
}
void
pop_max(self)
SV *self
PREINIT:
EXTRACT(self);
PPCODE:
{
int64_t m; double s; int ok;
ss_rwlock_wrlock(h);
ok = ss_pop_locked(h, 1, &m, &s);
if (ok) __atomic_fetch_add(&h->hdr->stat_ops, 1, __ATOMIC_RELAXED);
ss_rwlock_wrunlock(h);
if (ok) { EXTEND(SP, 2); PUSHs(sv_2mortal(newSViv((IV)m))); PUSHs(sv_2mortal(newSVnv(s))); }
}
bool
OUTPUT:
RETVAL
void
range_by_rank(self, start, stop, ...)
SV *self
IV start
IV stop
PREINIT:
EXTRACT(self);
PPCODE:
int ws = 0;
ss_parse_range_opts(aTHX_ &ST(0), 3, items, &ws, NULL, NULL);
REEXTRACT(self);
ss_rwlock_rdlock(h);
{
uint32_t s0 = 0, len = 0;
IV a, b;
if (ss_rank_window(h->hdr->count, start, stop, &a, &b)) { s0 = (uint32_t)a; len = (uint32_t)(b - a + 1); }
EMIT_COLLECTED(s0, len, 0, ws);
}
void
rev_range_by_rank(self, start, stop, ...)
SV *self
IV start
IV stop
PREINIT:
EXTRACT(self);
PPCODE:
int ws = 0;
ss_parse_range_opts(aTHX_ &ST(0), 3, items, &ws, NULL, NULL);
REEXTRACT(self);
ss_rwlock_rdlock(h);
{
uint32_t cnt = h->hdr->count, s0 = 0, len = 0;
IV a, b;
if (ss_rank_window(cnt, start, stop, &a, &b)) { s0 = (uint32_t)((IV)cnt - 1 - b); len = (uint32_t)(b - a + 1); }
EMIT_COLLECTED(s0, len, 1, ws);
}
void
range_by_score(self, min, max, ...)
SV *self
NV min
NV max
PREINIT:
EXTRACT(self);
PPCODE:
int ws = 0; IV limit = -1, offset = 0;
ss_parse_range_opts(aTHX_ &ST(0), 3, items, &ws, &limit, &offset);
REEXTRACT(self);
ss_rwlock_rdlock(h);
{
uint32_t lo;
uint32_t win = ss_count_in_score(h, (double)min, (double)max, &lo);
uint32_t off = (offset > 0) ? (offset >= (IV)win ? win : (uint32_t)offset) : 0;
uint32_t s0 = lo, len = 0;
if (off < win) { s0 = lo + off; len = win - off; if (limit >= 0 && limit < (IV)len) len = (uint32_t)limit; }
EMIT_COLLECTED(s0, len, 0, ws);
}
void
rev_range_by_score(self, max, min, ...)
SV *self
NV max
NV min
PREINIT:
EXTRACT(self);
PPCODE:
int ws = 0; IV limit = -1, offset = 0;
ss_parse_range_opts(aTHX_ &ST(0), 3, items, &ws, &limit, &offset);
REEXTRACT(self);
ss_rwlock_rdlock(h);
{
uint32_t lo;
uint32_t win = ss_count_in_score(h, (double)min, (double)max, &lo);
uint32_t off = (offset > 0) ? (offset >= (IV)win ? win : (uint32_t)offset) : 0;
uint32_t s0 = lo, len = 0;
if (off < win) { len = win - off; if (limit >= 0 && limit < (IV)len) len = (uint32_t)limit;
s0 = lo + (win - off - len); }
EMIT_COLLECTED(s0, len, 1, ws);
}
void
peek_min(self)
SV *self
PREINIT:
EXTRACT(self);
PPCODE:
ss_rwlock_rdlock(h);
if (h->hdr->root != SS_NONE && ss_node_ok(h, h->hdr->leftmost)) {
SsNode *nd = &h->nodes[h->hdr->leftmost];
IV m = (IV)nd->members[0]; NV s = nd->scores[0];
ss_rwlock_rdunlock(h);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(m)));
PUSHs(sv_2mortal(newSVnv(s)));
} else ss_rwlock_rdunlock(h);
void
peek_max(self)
SV *self
PREINIT:
EXTRACT(self);
PPCODE:
ss_rwlock_rdlock(h);
if (h->hdr->root != SS_NONE && ss_node_ok(h, h->hdr->rightmost)) {
SsNode *nd = &h->nodes[h->hdr->rightmost];
IV m = (IV)nd->members[nd->num - 1]; NV s = nd->scores[nd->num - 1];
ss_rwlock_rdunlock(h);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(m)));
PUSHs(sv_2mortal(newSVnv(s)));
} else ss_rwlock_rdunlock(h);
( run in 1.126 second using v1.01-cache-2.11-cpan-92ad3014f07 )