X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=libcds%2Fsrc%2Fstatic_bitsequence%2Fstatic_bitsequence_sdarray.cpp;h=8ce916470f86c581919f965d92db20c0be59749e;hb=e38bc834442d5369a523ba47d74865e48995ace4;hp=41bd316b22adad4ec3a47a032e232df3a77fcebe;hpb=06201fcce6255906ad6b4d305b8e643c634780a3;p=SXSI%2FXMLTree.git diff --git a/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp b/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp index 41bd316..8ce9164 100644 --- a/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp +++ b/libcds/src/static_bitsequence/static_bitsequence_sdarray.cpp @@ -2,70 +2,81 @@ #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; + uint * tmp_seq = new uint[uint_len(len,1)+1]; + ones = 0; + for(uint i=0;ilen = len; + //sd.lasti=(uint)-3; + //this->ones = sd.m; + delete [] tmp_seq; } -static_bitsequence_sdarray::static_bitsequence_sdarray() {} + +static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();} static_bitsequence_sdarray::~static_bitsequence_sdarray() { - if(ones) - selects3_free(&sd); + 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; + 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; + if(i>ones || i==0) return -1; + if(ones) + return selects3_select(&sd,i); + else + return (uint)-1; +} + + +uint static_bitsequence_sdarray::select_next1(uint i) { + return selects3_selectnext(&sd,i); } + uint static_bitsequence_sdarray::size() { - return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0); + 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; + 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; + 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; } -