Optimize sdarray.cpp to use g++ builtin instead of doing naive counting.
[SXSI/libcds.git] / src / static_bitsequence / static_bitsequence_sdarray.h
1
2 #ifndef _STATIC_BITSEQUENCE_SDARRAY_H
3 #define _STATIC_BITSEQUENCE_SDARRAY_H
4
5 #include <basics.h>
6 #include <static_bitsequence.h>
7 #include <sdarray.h>
8
9 class static_bitsequence_sdarray: public static_bitsequence {
10         protected:
11                 selects3 sd;
12                 static_bitsequence_sdarray();
13
14 public:
15                 static_bitsequence_sdarray(uint * buff, uint len);
16                 static_bitsequence_sdarray(uint * buff, uint len, uint);
17                 ~static_bitsequence_sdarray();
18
19                 virtual uint select1(uint i);
20                 virtual uint rank1(uint i);
21                 virtual uint select_next1(uint i);
22                 inline uint select(uint i) {
23                          if(i>ones || i==0) return -1;
24                          if(ones)
25                                  return selects3_select(&this->sd,i);
26                          else
27                                  return (uint)-1;
28                  }
29
30                  inline uint rank(uint i)  {
31                          if(i>=len) return -1;
32                          if(ones)
33                                  return selects3_rank(&this->sd, i);
34                          else
35                                  return 0;
36                  }
37
38                  inline uint select_next(uint i)  {
39                          return selects3_selectnext(&this->sd,i);
40                  }
41
42                 uint size();
43                 int save(FILE * fp);
44                 static static_bitsequence_sdarray * load(FILE * fp);
45
46 };
47
48 #endif
49