mistserver/lib/bitstream.h

94 lines
2.4 KiB
C++

#pragma once
#include<string>
#include "defines.h"
namespace Utils {
class bitstream {
public:
bitstream();
bitstream & operator<< (std::string input) {
append(input);
return *this;
};
bitstream & operator<< (char input) {
append(std::string(input, 1));
return *this;
};
void append(const char * input, size_t bytes);
void append(const std::string & input);
long long unsigned int size();
void skip(size_t count);
long long unsigned int get(size_t count);
long long unsigned int peek(size_t count);
bool peekOffset(size_t peekOffset);
void flush();
void clear();
long long int getExpGolomb();
long long unsigned int getUExpGolomb();
long long int peekExpGolomb();
long long unsigned int peekUExpGolomb();
static size_t bitSizeUExpGolomb(size_t value){
size_t i = 1;
size_t power = 2;
while (power - 2 < value){
i+= 2;
power *= 2;
}
return i;
}
private:
bool checkBufferSize(unsigned int size);
long long unsigned int golombGetter();
long long unsigned int golombPeeker();
char * data;
size_t offset;
size_t dataSize;
size_t bufferSize;
};
class bitWriter {
public:
bitWriter();
~bitWriter();
size_t size();
void append(uint64_t value, size_t bitLength);
void appendExpGolomb(uint64_t value);
void appendUExpGolomb(uint64_t value);
static size_t UExpGolombEncodedSize(uint64_t value);
std::string str() { return std::string(dataBuffer, (dataSize / 8) + (dataSize % 8 ? 1 : 0)); }
protected:
void reallocate(size_t newSize);
void appendData(uint8_t data, size_t len);
char * dataBuffer;
//NOTE: ALL SIZES IN BITS!
size_t bufferSize;
size_t dataSize;
};
class bitstreamLSBF {
public:
bitstreamLSBF();
bitstreamLSBF & operator<< (std::string input) {
append(input);
return *this;
};
void append(char * input, size_t bytes);
void append(std::string & input);
long long unsigned int size();
void skip(size_t count);
long long unsigned int get(size_t count);
long long unsigned int peek(size_t count);
void clear();
std::string data;
private:
long long unsigned int readBuffer;
unsigned int readBufferOffset;
void fixData();
};
}