Optimize sdarray.cpp to use g++ builtin instead of doing naive counting.
[SXSI/libcds.git] / src / static_bitsequence / static_bitsequence_sdarray.h
index f8944d4..2e739db 100644 (file)
@@ -7,22 +7,41 @@
 #include <sdarray.h>
 
 class static_bitsequence_sdarray: public static_bitsequence {
-       public:
+       protected:
+               selects3 sd;
+               static_bitsequence_sdarray();
+
+public:
                static_bitsequence_sdarray(uint * buff, uint len);
-               virtual ~static_bitsequence_sdarray();
+               static_bitsequence_sdarray(uint * buff, uint len, uint);
+               ~static_bitsequence_sdarray();
+
                virtual uint select1(uint i);
                virtual uint rank1(uint i);
                virtual uint select_next1(uint i);
-               virtual uint size();
-               virtual int save(FILE * fp);
-               static static_bitsequence_sdarray * load(FILE * fp);
+               inline uint select(uint i) {
+                        if(i>ones || i==0) return -1;
+                        if(ones)
+                                return selects3_select(&this->sd,i);
+                        else
+                                return (uint)-1;
+                }
 
-               uint select_next1_unsafe(uint i){
-                       return selects3_selectnext(&sd,i);      
-               };
-       protected:
-               selects3 sd;
-               static_bitsequence_sdarray();
+                inline uint rank(uint i)  {
+                        if(i>=len) return -1;
+                        if(ones)
+                                return selects3_rank(&this->sd, i);
+                        else
+                                return 0;
+                }
+
+                inline uint select_next(uint i)  {
+                        return selects3_selectnext(&this->sd,i);
+                }
+
+               uint size();
+               int save(FILE * fp);
+               static static_bitsequence_sdarray * load(FILE * fp);
 
 };