Optimize sdarray.cpp to use g++ builtin instead of doing naive counting.
[SXSI/libcds.git] / src / static_bitsequence / static_bitsequence_sdarray.cpp
1
2 #include <static_bitsequence_sdarray.h>
3
4 static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len) {
5   uint * tmp_seq = new uint[uint_len(len,1)+1];
6   ones = 0;
7   for(uint i=0;i<uint_len(len,1)+1;i++)
8     tmp_seq[i] = 0;
9   for(uint i=0;i<len;i++)
10   if(bitget(buff,i)) {
11     __setbit(tmp_seq,i,1);
12     ones++;
13   }
14   if(ones)
15     selects3_construct(&sd,len,tmp_seq);
16   this->len = len;
17         //sd.lasti=(uint)-3;
18   //this->ones = sd.m;
19   delete [] tmp_seq;
20 }
21
22 static_bitsequence_sdarray::static_bitsequence_sdarray(uint * buff, uint len, uint ones_) {
23
24   ones = ones_;
25   if(ones)
26     selects3_construct(&sd,len,buff);
27   this->len = len;
28 }
29
30
31 static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();}
32
33 static_bitsequence_sdarray::~static_bitsequence_sdarray() {
34   if(ones)
35     selects3_free(&sd);
36 }
37
38
39 uint static_bitsequence_sdarray::size() {
40   return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0);
41 }
42
43
44 int static_bitsequence_sdarray::save(FILE * fp) {
45   uint wr = SDARRAY_HDR;
46   wr = fwrite(&wr,sizeof(uint),1,fp);
47   wr += fwrite(&len,sizeof(uint),1,fp);
48   wr += fwrite(&ones,sizeof(uint),1,fp);
49   if(wr!=3 || (ones?(selects3_save(&sd,fp)):false))
50     return 1;
51   return 0;
52 }
53
54
55 static_bitsequence_sdarray * static_bitsequence_sdarray::load(FILE * fp) {
56   uint id;
57   if(fread(&id,sizeof(uint),1,fp)!=1) return NULL;
58   if(id!=SDARRAY_HDR) return NULL;
59   static_bitsequence_sdarray * ret = new static_bitsequence_sdarray();
60   id = fread(&ret->len,sizeof(uint),1,fp);
61   id += fread(&ret->ones,sizeof(uint),1,fp);
62   if(ret->ones && selects3_load(&ret->sd,fp)) {
63     delete ret;
64     return NULL;
65   }
66   return ret;
67 }
68
69 uint static_bitsequence_sdarray::select1(uint i) { return this->select(i); }
70 uint static_bitsequence_sdarray::rank1(uint i) { return this->rank(i); }
71 uint static_bitsequence_sdarray::select_next1(uint i) { return this->select_next(i); }