X-Git-Url: http://git.nguyen.vg/gitweb/?p=SXSI%2Flibbp.git;a=blobdiff_plain;f=bp-darray.h;h=e46834fa52b528c32b7743930c7996d2e98e0e69;hp=23d44a4c6bdfb601841bcbec164f8da5255d980e;hb=HEAD;hpb=45ff7a2260f890f6ef6a7b56f654ffa1a057a7e7 diff --git a/bp-darray.h b/bp-darray.h index 23d44a4..e46834f 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,36 @@ 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 inline int bp_darray_rank(darray *da, int i) +{ + int r,j,i_rr, i_rrr; + int offset; + pb *p; + byte *buff; + i_rr = i >> logRR; + i_rrr = i >> logRRR; + r = da->rl[i>>logR] + da->rm[i_rr]; + + j = (i_rrr) & (RR/RRR-1); + offset = i_rr << (logRR-logRRR); + buff = &(da->rs[offset-1]); + while (j > 0) { + r += buff[j]; + 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 *));