#ifndef WWWI_MIND_BUFFER_H
#define WWWI_MIND_BUFFER_H
#include "mind.h"
#include "labellist.h"
class Buffer {
public:
Buffer(size_t i_szBufferMax);
template <class SM> void DumpRange(SM &io_smr, off_t i_of, size_t i_sz) const;
off_t FindInRange(off_t i_ofBegin, off_t i_ofEnd, const unsigned char* ci_ucpFind, size_t i_szFind);
inline unsigned char Get(off_t i_of) const;
inline const unsigned char *GetBuffer(void) const;
inline off_t GetPos(void) const;
inline size_t GetSize(void) const;
template <class T> void PReadNBO(T &o_tr, off_t i_of) const;
template <class T> void PWriteNBO(const T &i_tr, off_t i_of);
template <class T> void Read(T &o_tr) const;
bool ReadBit(off_t i_off, unsigned char i_ucBit) const;
void ReadBits(bool &o_br7, bool &o_br6, bool &o_br5, bool &o_br4, bool &o_br3, bool &o_br2, bool &o_br1, bool &o_br0) const;
void ReadData(void *o_ptrData, size_t i_szData) const;
void ReadData(void *o_ptrData, size_t i_szData, off_t &io_off) const;
void ReadLabelList(unsigned char *o_ucpOut, size_t i_szOut, unsigned short &o_usLength, bool i_bUseCompression) const;
void ReadLabelList(unsigned char *o_ucpOut, size_t i_szOut, unsigned short &o_usLength, bool i_bUseCompression, off_t &io_ofrPos) const;
void ReadLabelList(LabelListPtr &o_llpr, bool i_bUseCompression) const;
template <class T> void ReadNBO(T &o_tr) const;
inline void SetPos(off_t i_ofPos);
inline void Truncate(void);
void TryCompression(off_t i_ofStart);
template <class T> void Write(const T &i_tr);
void WriteBit(bool i_bBit, off_t i_of, unsigned char i_ucBit);
void WriteBits(bool i_b7, bool i_b6, bool i_b5, bool i_b4, bool i_b3, bool i_b2, bool i_b1, bool i_b0);
void WriteData(const void *i_ptrData, size_t i_szData);
void WriteData(const void *i_ptrData, size_t i_szData, off_t i_of);
unsigned short WriteLabelList(LabelListConstPtr ci_llp, bool i_bUseCompression);
template <class T> void WriteNBO(const T &i_tr);
~Buffer(void);
protected:
off_t FindPreviousLabelList(off_t i_ofBegin, off_t i_ofEnd, const unsigned char *ci_ucpFind, size_t i_szFind);
bool TestLabelList(const unsigned char *i_ucpLabels, size_t i_szLabels, off_t i_ofPos);
protected:
unsigned char *m_ucpBuffer;
size_t m_szBuffer;
size_t m_szBufferMax;
mutable off_t m_ofPos;
};
typedef Buffer *BufferPtr;
typedef const Buffer *BufferConstPtr;
ostream& operator<<(ostream& io_smr, const Buffer &ci_bfr);
ostream& operator<<(ostream& io_smr, BufferConstPtr ci_bfp);
#include "buffer.i"
#endif