X-Git-Url: http://git.nguyen.vg/gitweb/?p=SXSI%2Flibbp.git;a=blobdiff_plain;f=bp-darray.h;fp=bp-darray.h;h=4224dbafce4287a3fa27031d8360822197b2fa96;hp=23d44a4c6bdfb601841bcbec164f8da5255d980e;hb=9614bef67d59eaa2413e2b06e5587c6caec57840;hpb=6d6af09ca53949cbcabb1677c63a50b2371225ff diff --git a/bp-darray.h b/bp-darray.h index 23d44a4..4224dba 100644 --- a/bp-darray.h +++ b/bp-darray.h @@ -4,6 +4,7 @@ #ifdef __cplusplus extern "C" { #endif +#include "bp-utils.h" typedef unsigned char byte; typedef unsigned short word; @@ -36,7 +37,31 @@ darray * bp_darray_construct(int n, pb *buf,int opt); void bp_darray_free(darray *da); int bp_darray_select(darray *da, int i,int f); -int bp_darray_rank(darray *da, int i); +static int bp_darray_rank(darray *da, int i) +{ + int r,j,i_rr, i_rrr; + pb *p; + i_rr = i >> logRR; + i_rrr = i >> logRRR; + r = da->rl[i>>logR] + da->rm[i_rr]; + + j = (i_rrr) & (RR/RRR-1); + while (j > 0) { + r += da->rs[((i_rr)<<(logRR-logRRR))+j-1]; + j--; + } + + p = da->buf + ((i_rrr)<<(logRRR-logD)); + j = i & (RRR-1); + while (j >= D) { + r += popcount(*p++); + j -= D; + } + r += popcount(*p >> (D-1-j)); + + return r; +} + darray * bp_darray_pat_construct(int n, pb *buf, int k, pb pat, int opt); int bp_darray_pat_select(darray *da, int i, pb (*getpat)(pb *)); int bp_darray_pat_rank(darray *da, int i, pb (*getpat)(pb *));