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]));
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++)
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++)
26 static_sequence_bs::static_sequence_bs() {
33 static_sequence_bs::~static_sequence_bs() {
35 for(uint i=0;i<sigma;i++) {
36 if(bitmaps[i]!=NULL) delete bitmaps[i];
40 if(am!=NULL) am->unuse();
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);
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);
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);
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();
67 uint static_sequence_bs::save(FILE * fp) {
69 wr = fwrite(&wr,sizeof(uint),1,fp);
70 wr += fwrite(&len,sizeof(uint),1,fp);
71 wr += fwrite(&sigma,sizeof(uint),1,fp);
73 for(uint i=0;i<sigma;i++)
74 if(bitmaps[i]->save(fp)) return 2;
75 if(am->save(fp)) return 3;
79 static_sequence_bs * static_sequence_bs::load(FILE * fp) {
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) {
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) {
98 if((ret->am = alphabet_mapper::load(fp))==NULL) {