mistserver/lib/bitstream.h

96 lines
2.3 KiB
C++

#pragma once
#include "defines.h"
#include <string>
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;
}
~bitstream();
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(int64_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();
};
}// namespace Utils