33c105934294c35c6c84b7028f4646a14643c889
[SXSI/XMLTree.git] / libcds / 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
23 static_bitsequence_sdarray::static_bitsequence_sdarray() {make___selecttbl();}
24
25 static_bitsequence_sdarray::~static_bitsequence_sdarray() {
26   if(ones)
27     selects3_free(&sd);
28 }
29
30
31 uint static_bitsequence_sdarray::rank1(uint i) {
32   if(i>=len) return -1;
33   if(ones)
34     return selects3_rank(&sd,i);
35   else
36     return 0;
37 }
38
39
40 uint static_bitsequence_sdarray::select1(uint i) {
41   if(i>ones || i==0) return -1;
42   if(ones)
43     return selects3_select(&sd,i);
44   else
45     return (uint)-1;
46 }
47
48
49 uint static_bitsequence_sdarray::select_next1(uint i) {
50   return selects3_selectnext(&sd,i);
51 }
52
53
54 uint static_bitsequence_sdarray::size() {
55   return sizeof(static_bitsequence_sdarray)+(ones?(sd.size + sd.sd0->size + sd.sd1->size):0);
56 }
57
58
59 int static_bitsequence_sdarray::save(FILE * fp) {
60   uint wr = SDARRAY_HDR;
61   wr = fwrite(&wr,sizeof(uint),1,fp);
62   wr += fwrite(&len,sizeof(uint),1,fp);
63   wr += fwrite(&ones,sizeof(uint),1,fp);
64   if(wr!=3 || (ones?(selects3_save(&sd,fp)):false))
65     return 1;
66   return 0;
67 }
68
69
70 static_bitsequence_sdarray * static_bitsequence_sdarray::load(FILE * fp) {
71   uint id;
72   if(fread(&id,sizeof(uint),1,fp)!=1) return NULL;
73   if(id!=SDARRAY_HDR) return NULL;
74   static_bitsequence_sdarray * ret = new static_bitsequence_sdarray();
75   id = fread(&ret->len,sizeof(uint),1,fp);
76   id += fread(&ret->ones,sizeof(uint),1,fp);
77   if(ret->ones && selects3_load(&ret->sd,fp)) {
78     delete ret;
79     return NULL;
80   }
81   return ret;
82 }