X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_bitsequence%2Fstatic_bitsequence_sdarray.cpp;fp=libcds%2Fsrc%2Fstatic_bitsequence%2Fstatic_bitsequence_sdarray.cpp;h=e50e0746e57e66e240da3df8353e9139a11f2ca3;hb=bbeeb03980ddf51c0f32fd3c42321dc9ef708c27;hp=0000000000000000000000000000000000000000;hpb=6a9117a97674437c9fe00b099c40ccb61d45d704;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp b/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp new file mode 100644 index 0000000..e50e074 --- /dev/null +++ b/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp @@ -0,0 +1,71 @@ + +#include + +static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len) { + uint * tmp_seq = new uint[uint_len(len,1)+1]; + ones = 0; + for(uint i=0;ilen = len; + //this->ones = sd.m; + delete [] tmp_seq; +} + +static_bitsequence_sdarray::static_bitsequence_sdarray() {} + +static_bitsequence_sdarray::~static_bitsequence_sdarray() { + if(ones) + selects3_free(&sd); +} + +uint static_bitsequence_sdarray::rank1(uint i) { + if(i>len) return -1; + if(ones) + return selects3_rank(&sd,i); + else + return 0; +} + +uint static_bitsequence_sdarray::select1(uint i) { + if(i>ones) return -1; + if(ones) + return selects3_select(&sd,i); + else + return (uint)-1; +} + +uint static_bitsequence_sdarray::size() { + return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0); +} + +int static_bitsequence_sdarray::save(FILE * fp) { + uint wr = SDARRAY_HDR; + wr = fwrite(&wr,sizeof(uint),1,fp); + wr += fwrite(&len,sizeof(uint),1,fp); + wr += fwrite(&ones,sizeof(uint),1,fp); + if(wr!=3 || (ones?(selects3_save(&sd,fp)):false)) + return 1; + return 0; +} + +static_bitsequence_sdarray * static_bitsequence_sdarray::load(FILE * fp) { + uint id; + if(fread(&id,sizeof(uint),1,fp)!=1) return NULL; + if(id!=SDARRAY_HDR) return NULL; + static_bitsequence_sdarray * ret = new static_bitsequence_sdarray(); + id = fread(&ret->len,sizeof(uint),1,fp); + id += fread(&ret->ones,sizeof(uint),1,fp); + if(ret->ones && selects3_load(&ret->sd,fp)) { + delete ret; + return NULL; + } + return ret; +} +