fecca78a864bd375521d34f5dc9dac299f997f78
[SXSI/XMLTree.git] / libcds / src / static_sequence / static_sequence_bs.cpp
1
2 #include <static_sequence_bs.h>
3
4 static_sequence_bs::static_sequence_bs(uint * seq, uint n, alphabet_mapper * am, static_bitsequence_builder * bmb) {
5         sigma = 0;
6         len = n;
7         this->am = am;
8         am->use();
9         for(uint i=0;i<n;i++) sigma=max(sigma,am->map(seq[i]));
10         bitmaps = new static_bitsequence*[++sigma];
11         uint ** bm = new uint*[sigma];
12         for(uint i=0;i<sigma;i++) {
13                 bm[i] = new uint[uint_len(len,1)];
14                 for(uint j=0;j<uint_len(len,1);j++)
15                         bm[i][j] = 0;
16         }
17         for(uint i=0;i<n;i++) 
18                 bitset(bm[am->map(seq[i])],i);
19         for(uint i=0;i<sigma;i++)
20                 bitmaps[i] = bmb->build(bm[i],len);
21         for(uint i=0;i<sigma;i++)
22                 delete [] bm[i];
23         delete [] bm;
24 }
25
26 static_sequence_bs::static_sequence_bs() {
27         len = 0;
28         sigma = 0;
29         bitmaps = NULL;
30         am = NULL;
31 }
32
33 static_sequence_bs::~static_sequence_bs() {
34         if(bitmaps!=NULL) {
35                 for(uint i=0;i<sigma;i++) {
36                         if(bitmaps[i]!=NULL) delete bitmaps[i];
37                 }
38                 delete [] bitmaps;
39         }
40         if(am!=NULL) am->unuse();
41 }
42
43 uint static_sequence_bs::rank(uint c, uint i) {
44         if(am->map(c)>=sigma) return (uint)-1;
45         return bitmaps[am->map(c)]->rank1(i);
46 }
47
48 uint static_sequence_bs::select(uint c, uint i) {
49         if(am->map(c)>=sigma) return (uint)-1;
50         return bitmaps[am->map(c)]->select1(i);
51 }
52
53 uint static_sequence_bs::access(uint i) {
54         for(uint j=0;j<sigma;j++) {
55                 if(bitmaps[j]->access(i)) return am->unmap(j);
56         }
57         return (uint)-1;
58 }
59
60 uint static_sequence_bs::size() {
61         uint size = sizeof(static_sequence_bs)+am->size();
62         for(uint i=0;i<sigma;i++) 
63                 size += bitmaps[i]->size();
64         return size;
65 }
66
67 uint static_sequence_bs::save(FILE * fp) {
68         uint wr = BS_HDR;
69         wr = fwrite(&wr,sizeof(uint),1,fp);
70         wr += fwrite(&len,sizeof(uint),1,fp);
71         wr += fwrite(&sigma,sizeof(uint),1,fp);
72         if(wr!=3) return 1;
73         for(uint i=0;i<sigma;i++)
74                 if(bitmaps[i]->save(fp)) return 2;
75         if(am->save(fp)) return 3;
76         return 0;
77 }
78
79 static_sequence_bs * static_sequence_bs::load(FILE * fp) {
80         uint rd = 0;
81         uint type = 0;
82         rd += fread(&type,sizeof(uint),1,fp);
83         static_sequence_bs * ret = new static_sequence_bs();
84         rd += fread(&ret->len,sizeof(uint),1,fp);
85         rd += fread(&ret->sigma,sizeof(uint),1,fp);
86         if(rd!=3 || type != BS_HDR) {
87                 delete ret;
88                 return NULL;
89         }
90         ret->bitmaps = new static_bitsequence*[ret->sigma];
91         for(uint i=0;i<ret->sigma;i++)
92                 ret->bitmaps[i] = NULL;
93         for(uint i=0;i<ret->sigma;i++)
94                 if((ret->bitmaps[i]=static_bitsequence::load(fp))==NULL) {
95                         delete ret;
96                         return NULL;
97                 }
98         if((ret->am = alphabet_mapper::load(fp))==NULL) {
99                 delete ret;
100                 return NULL;
101         }
102         ret->am->use();
103         return ret;
104 }
105