-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbitstream.hpp
136 lines (130 loc) · 6.11 KB
/
bitstream.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef BITSTREAM_HEADER
#define BITSTREAM_HEADER
#include <vector>
#include <iostream>
#include "binpots.hpp" // Incluida en bitset
#include "bitset.hpp"
#include <string>
namespace rcl{
class bitstream{
private:
std::vector<unsigned char> data;
unsigned char current,mask;
class ref{
public:
ref(unsigned char& c,const unsigned char& m):current(c),mask(m){return;}
private:
unsigned char& current;
const unsigned char mask;
public:
ref& operator =(const bool& bit){if (bit) current|=mask; else current&=(~mask); return *this;}
operator bool(){ return (mask¤t);}
void flip(){current^=mask; return;}
};
public:
bitstream():current(0),mask(128){return;}
bitstream(const unsigned char* begin,const unsigned int& length):current(0),mask(128),data(begin,begin+length){return;}
bitstream(const unsigned int& size):data(size,0){return;}
bitstream(const std::vector<unsigned char>& src):current(0),mask(128),data(src){return;}
void push(const bool& bit){if (bit) set(); advance(); return;}
void set(){current|=mask; return;}
void write(){set(); advance(); return;}
void advance(){mask>>=1; if(!mask) push_back(); return;}
void push_back(){data.push_back(current); reset(); return;}
void reset(){ current=0; mask=128; return;}
template<int N> void push(const bitset<N>& k){ push<N>(k); return;}
template<int N> void push(const unsigned int& x){ push_nth<N>(x); push<N-1>(x); return;}
template<int N> void push_nth(const unsigned int& x){ if (x&pot<N>) write(); else advance(); return;}
unsigned int bsize()const{ return 8*data.size();}
unsigned int size()const {return data.size();}
void resize(const unsigned int& x) { data.resize(x);}
unsigned char& operator()(const unsigned int& idx){return data[idx];}
const unsigned char& operator()(const unsigned int& idx)const{return data[idx];}
ref operator[](const unsigned int& x){ return ref(data[x>>3],128>>(x&7));}
void writeat(const unsigned int& x){ data[x>>3]|=(128>>(x&7));}
bool readat(const unsigned int& x)const{return data[x>>3]&(128>>(x&7));}
unsigned char* begin(){return &(*data.begin());}
const unsigned char* begin()const{return &(*data.begin());}
unsigned char* end(){return &(*data.end());}
const unsigned char* end() const {return &(*data.end());}
const std::vector<unsigned char>& getvec() const{return data;}
void setvec(const std::vector<unsigned char>& d){data=d; return;}
std::string to_binary(const unsigned int& in,const unsigned int& fi){
std::string ans;
for (unsigned int idx=in;idx<fi;idx++) if (data[idx>>3]&(128>>(idx&7))) ans.push_back('1'); else ans.push_back('0');
return ans;
}
std::string to_hex(const unsigned int& in,const unsigned int& fi){
std::string ans;
const std::string base("0123456789ABCDEF");
for (unsigned int idx=in;idx<fi;idx++)
{
ans.push_back(base[data[idx]>>4]);
ans.push_back(base[data[idx]&15]);
}
return ans;
}
};
template<> inline void bitstream::push<0>(const unsigned int& x) { push_nth<0>(x); return;}
class bitstream64{
private:
std::vector<unsigned long long int> data;
unsigned long long int current,mask;
class ref{
public:
ref(unsigned long long int& c,const unsigned long long int& m):current(c),mask(m){return;}
private:
unsigned long long int& current;
const unsigned long long int mask;
public:
ref& operator =(const bool& bit){if (bit) current|=mask; else current&=(~mask); return *this;}
operator bool(){ return (mask¤t);}
void flip(){current^=mask; return;}
};
public:
bitstream64():current(0),mask(9223372036854775808UL){return;}
bitstream64(const unsigned long long int* begin,const unsigned int& length):current(0),mask(9223372036854775808UL),data(begin,begin+length){return;}
bitstream64(const unsigned int& size):data(size,0){return;}
bitstream64(const std::vector<unsigned long long int>& src):current(0),mask(9223372036854775808UL),data(src){return;}
void push(const bool& bit){if (bit) set(); advance(); return;}
void set(){current|=mask; return;}
void write(){set(); advance(); return;}
void advance(){mask>>=1; if(!mask) push_back(); return;}
void push_back(){data.push_back(current); reset(); return;}
void reset(){ current=0; mask=9223372036854775808UL; return;}
template<int N> void push(const bitset<N>& k){ push<N>(k); return;}
template<int N> void push(const unsigned int& x){ push_nth<N>(x); push<N-1>(x); return;}
template<int N> void push_nth(const unsigned int& x){ if (x&pot<N>) write(); else advance(); return;}
unsigned int bsize()const{ return 64*data.size();}
unsigned int size()const {return data.size();}
void resize(const unsigned int& x) { data.resize(x);}
unsigned long long int& operator()(const unsigned int& idx){return data[idx];}
const unsigned long long int& operator()(const unsigned int& idx)const{return data[idx];}
ref operator[](const unsigned int& x){ return ref(data[x>>6],9223372036854775808UL>>(x&63));}
void writeat(const unsigned int& x){ data[x>>6]|=(9223372036854775808UL>>(x&63));}
bool readat(const unsigned int& x)const{return data[x>>6]&(9223372036854775808UL>>(x&63));}
unsigned long long int* begin(){return &(*data.begin());}
const unsigned long long int* begin()const{return &(*data.begin());}
unsigned long long int* end(){return &(*data.end());}
const unsigned long long int* end() const {return &(*data.end());}
const std::vector<unsigned long long int>& getvec() const{return data;}
void setvec(const std::vector<unsigned long long int>& d){data=d; return;}
std::string to_binary(const unsigned int& in,const unsigned int& fi){
std::string ans;
for (unsigned int idx=in;idx<fi;idx++) if (data[idx>>6]&(9223372036854775808UL>>(idx&63))) ans.push_back('1'); else ans.push_back('0');
return ans;
}
std::string to_hex(const unsigned int& in,const unsigned int& fi){
std::string ans;
const std::string base("0123456789ABCDEF");
for (unsigned int idx=in;idx<fi;idx++)
{
ans.push_back(base[data[idx]>>4]);
ans.push_back(base[data[idx]&15]);
}
return ans;
}
};
template<> inline void bitstream64::push<0>(const unsigned int& x) { push_nth<0>(x); return;}
}
#endif