2 #include <static_sequence_bs.h>
4 static_sequence_bs::static_sequence_bs(uint * seq, uint n, alphabet_mapper * am, static_bitsequence_builder * bmb) {
9 for(uint i=0;i<n;i++) sigma=max(sigma,am->map(seq[i]));
11 uint * occ = new uint[sigma+1];
12 for(uint i=0;i<=sigma;i++) occ[i] = 0;
13 for(uint i=0;i<n;i++) occ[am->map(seq[i])+1]++;
14 for(uint i=1;i<sigma;i++) occ[i] += occ[i-1];
15 uint * pos = new uint[n];
16 for(uint i=0;i<n;i++) pos[i] = 0;
17 for(uint i=0;i<n;i++) pos[occ[am->map(seq[i])]++]=i;
18 bitmaps = new static_bitsequence*[sigma];
19 uint * bm = new uint[uint_len(n,1)];
21 for(uint i=0;i<sigma;i++) {
22 for(uint j=0;j<uint_len(n,1);j++) bm[j]=0;
27 bitmaps[i] = bmb->build(bm,len);
34 static_sequence_bs::static_sequence_bs() {
41 static_sequence_bs::~static_sequence_bs() {
43 for(uint i=0;i<sigma;i++) {
44 if(bitmaps[i]!=NULL) delete bitmaps[i];
48 if(am!=NULL) am->unuse();
51 uint static_sequence_bs::rank(uint c, uint i) {
52 if(am->map(c)>=sigma) return (uint)-1;
53 return bitmaps[am->map(c)]->rank1(i);
56 uint static_sequence_bs::select(uint c, uint i) {
57 if(am->map(c)>=sigma) return (uint)-1;
58 return bitmaps[am->map(c)]->select1(i);
61 uint static_sequence_bs::select_next(uint c, uint i) {
62 if(am->map(c)>=sigma) return (uint)-1;
63 return bitmaps[am->map(c)]->select_next1(i);
66 uint static_sequence_bs::select(uint c, uint i) {
67 if(c>=sigma) return (uint)-1;
68 return bitmaps[c]->select1(i);
70 uint static_sequence_bs::select_next(uint c, uint i) {
71 if(c>=sigma) return (uint)-1;
72 return bitmaps[c]->select_next1(i);
74 uint static_sequence_bs::access(uint i) {
75 for(uint j=0;j<sigma;j++) {
76 if(bitmaps[j]->access(i)) return am->unmap(j);
81 uint static_sequence_bs::size() {
82 uint size = sizeof(static_sequence_bs)+am->size();
83 for(uint i=0;i<sigma;i++)
84 size += bitmaps[i]->size();
88 uint static_sequence_bs::save(FILE * fp) {
90 wr = fwrite(&wr,sizeof(uint),1,fp);
91 wr += fwrite(&len,sizeof(uint),1,fp);
92 wr += fwrite(&sigma,sizeof(uint),1,fp);
94 for(uint i=0;i<sigma;i++)
95 if(bitmaps[i]->save(fp)) return 2;
96 if(am->save(fp)) return 3;
100 static_sequence_bs * static_sequence_bs::load(FILE * fp) {
103 rd += fread(&type,sizeof(uint),1,fp);
104 static_sequence_bs * ret = new static_sequence_bs();
105 rd += fread(&ret->len,sizeof(uint),1,fp);
106 rd += fread(&ret->sigma,sizeof(uint),1,fp);
107 if(rd!=3 || type != BS_HDR) {
111 ret->bitmaps = new static_bitsequence*[ret->sigma];
112 for(uint i=0;i<ret->sigma;i++)
113 ret->bitmaps[i] = NULL;
114 for(uint i=0;i<ret->sigma;i++)
115 if((ret->bitmaps[i]=static_bitsequence::load(fp))==NULL) {
119 if((ret->am = alphabet_mapper::load(fp))==NULL) {