Add nextNodeBefore primitive.
[SXSI/XMLTree.git] / libcds / src / static_bitsequence / static_bitsequence.cpp
index 65de9c4..ad07b84 100644 (file)
@@ -26,8 +26,9 @@ uint static_bitsequence::rank0(uint i) {
 }
 
 uint static_bitsequence::rank1(uint i) {
-  if(i>=len) return ones;
-  if(ones==0) return -1;
+  if(i>=len) return (uint)-1;
+  if(ones==0) return 0;
+       if(ones==len) return i+1;
   uint ini = 1;
   uint fin = ones;
   while(ini<fin) {
@@ -44,8 +45,9 @@ uint static_bitsequence::rank1(uint i) {
 }
 
 uint static_bitsequence::select0(uint i) {
-  if(i>len-ones) return len;
+  if(i>len-ones) return -1;
   if(i==0) return -1;
+       if(ones==0) return i-1;
   uint ini = 0;
   uint fin = len-1;
   while(ini<fin) {
@@ -60,8 +62,9 @@ uint static_bitsequence::select0(uint i) {
 }
 
 uint static_bitsequence::select1(uint i) {
-  if(i>ones) return len;
-  if(i==0) return 0;
+  if(i>ones) return -1;
+  if(i==0) return -1;
+       if(ones==len) return i-1;
   uint ini = 0;
   uint fin = len-1;
   while(ini<fin) {
@@ -75,6 +78,14 @@ uint static_bitsequence::select1(uint i) {
        return ini;
 }
 
+uint static_bitsequence::select_next1(uint i) {
+       return select1(rank1(i)+1);
+}
+
+uint static_bitsequence::select_next0(uint i) {
+       return select0(rank0(i)+1);
+}
+
 bool static_bitsequence::access(uint i) {
   return (rank1(i)-(i!=0?rank1(i-1):0))>0;
 }
@@ -98,7 +109,8 @@ static_bitsequence * static_bitsequence::load(FILE * fp) {
   switch(r) {
     case RRR02_HDR: return static_bitsequence_rrr02::load(fp);
     case BRW32_HDR: return static_bitsequence_brw32::load(fp);
+    case RRR02_LIGHT_HDR: return static_bitsequence_rrr02_light::load(fp);
+    case SDARRAY_HDR: return static_bitsequence_sdarray::load(fp);
   }
   return NULL;
 }
-