2 #include <wt_coder_huff.h>
4 wt_coder_huff::wt_coder_huff(uint * symbs, uint n, alphabet_mapper * am) {
6 symbs[i] = am->map(symbs[i]);
7 hc = new huffman_codes(symbs, n);
8 buffer = new uint[hc->max_length()/W+1];
9 s_len = 0; last_symbol = (uint)-1;
11 symbs[i] = am->unmap(symbs[i]);
14 wt_coder_huff::wt_coder_huff() {}
16 wt_coder_huff::~wt_coder_huff() {
21 bool wt_coder_huff::is_set(uint symbol, uint l) {
22 if(symbol!=last_symbol) {
23 s_len = (uint)hc->encode(symbol, buffer, (ulong)0);
26 return bitget(buffer,l);
29 bool wt_coder_huff::done(uint symbol, uint l) {
30 if(symbol!=last_symbol) {
31 s_len = (uint)hc->encode(symbol, buffer, (ulong)0);
37 uint wt_coder_huff::size() {
38 return 2*sizeof(uint)+sizeof(wt_coder_huff)+hc->size()+(hc->max_length()/W+1)*sizeof(uint);
41 uint wt_coder_huff::save(FILE * fp) {
42 uint wr = WT_CODER_HUFF_HDR;
43 wr = fwrite(&wr,sizeof(uint),1,fp);
45 if(hc->save(fp)) return 1;
46 //if(am->save(fp)) return 1;
50 wt_coder_huff * wt_coder_huff::load(FILE *fp) {
52 if(fread(&rd,sizeof(uint),1,fp)!=1) return NULL;
53 if(rd!=WT_CODER_HUFF_HDR) return NULL;
54 wt_coder_huff * ret = new wt_coder_huff();
55 ret->hc = huffman_codes::load(fp);
56 ret->buffer = new uint[ret->hc->max_length()/W+1];
57 ret->s_len = 0; ret->last_symbol = (uint)-1;