Optimize sdarray.cpp to use g++ builtin instead of doing naive counting.
[SXSI/libcds.git] / src / static_bitsequence / static_bitsequence_sdarray.cpp
index 8ce9164..df93b37 100644 (file)
@@ -19,35 +19,20 @@ static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len) {
   delete [] tmp_seq;
 }
 
+static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len, uint ones_) {
 
-static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();}
-
-static_bitsequence_sdarray::~static_bitsequence_sdarray() {
+  ones = ones_;
   if(ones)
-    selects3_free(&sd);
+    selects3_construct(&sd,len,buff);
+  this->len = len;
 }
 
 
-uint static_bitsequence_sdarray::rank1(uint i) {
-  if(i>=len) return -1;
-  if(ones)
-    return selects3_rank(&sd,i);
-  else
-    return 0;
-}
-
+static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();}
 
-uint static_bitsequence_sdarray::select1(uint i) {
-  if(i>ones || i==0) return -1;
+static_bitsequence_sdarray::~static_bitsequence_sdarray() {
   if(ones)
-    return selects3_select(&sd,i);
-  else
-    return (uint)-1;
-}
-
-
-uint static_bitsequence_sdarray::select_next1(uint i) {
-  return selects3_selectnext(&sd,i);
+    selects3_free(&sd);
 }
 
 
@@ -80,3 +65,7 @@ static_bitsequence_sdarray * static_bitsequence_sdarray::load(FILE * fp) {
   }
   return ret;
 }
+
+uint static_bitsequence_sdarray::select1(uint i) { return this->select(i); }
+uint static_bitsequence_sdarray::rank1(uint i) { return this->rank(i); }
+uint static_bitsequence_sdarray::select_next1(uint i) { return this->select_next(i); }