13 namespace Gorgon {
namespace Encoding {
21 int (*Read)(
void *p,
void *buf,
size_t *size);
26 std::size_t (*Write)(
void *p,
const void *buf,
size_t size);
33 int ReadVector(
void *p,
void *buf,
size_t *size);
35 class VectorReader :
public Reader {
37 VectorReader(
const std::vector<Byte> &Buf) : Buf(Buf), BufPos(0) {
41 const std::vector<Byte> &Buf;
44 inline Reader *ReadyReadStruct(
const std::vector<Byte> &vec) {
45 return new VectorReader(vec);
47 inline unsigned long long GetReadSize(
const std::vector<Byte> &vec) {
50 inline void VectorSeek(Reader *r,
long long addr) {
51 VectorReader *reader=(VectorReader *)r;
52 reader->BufPos+=(unsigned)addr;
54 inline std::function<void(Reader*,
long long)> SeekFn(
const std::vector<Byte> &vec) {
57 inline int ReadVector(
void *p,
void *buf,
size_t *size) {
58 VectorReader *reader = (VectorReader*)p;
59 *size = std::min(*size, reader->Buf.size() - reader->BufPos);
61 std::memcpy(buf, &reader->Buf[reader->BufPos], *size);
62 reader->BufPos += *size;
67 std::size_t
WriteVector(
void *p,
const void *buf,
size_t size);
68 class VectorWriter :
public Writer {
70 VectorWriter(std::vector<Byte> &Buf) : Buf(Buf) {
74 std::vector<Byte> &Buf;
76 inline Writer *ReadyWriteStruct(std::vector<Byte> &vec) {
77 return new VectorWriter(vec);
79 inline std::size_t
WriteVector(
void *p,
const void *buf,
size_t size) {
80 VectorWriter *writer = (VectorWriter*)p;
83 std::size_t oldSize = writer->Buf.size();
84 writer->Buf.resize(oldSize + size);
85 std::memcpy(&writer->Buf[oldSize], buf, size);
93 int ReadArray(
void *p,
void *buf,
size_t *size);
95 class ArrayReader :
public Reader {
97 ArrayReader(
const Byte *Buf) : Buf(Buf), BufPos(0) {
104 inline Reader *ReadyReadStruct(
const Byte *vec) {
105 return new ArrayReader(vec);
107 inline unsigned long long GetReadSize(
const Byte *vec) {
108 return (
unsigned long long)(
long long)-1;
110 inline void ArraySeek(Reader *r,
long long addr) {
111 ArrayReader *reader=(ArrayReader *)r;
112 reader->BufPos+=(unsigned)addr;
114 inline std::function<void(Reader*,
long long)> SeekFn(
const Byte *vec) {
117 inline int ReadArray(
void *p,
void *buf,
size_t *size) {
118 ArrayReader *reader = (ArrayReader*)p;
119 std::memcpy(buf, &reader->Buf[reader->BufPos], *size);
120 reader->BufPos += *size;
125 std::size_t
WriteArray(
void *p,
const void *buf,
size_t size);
126 class ArrayWriter :
public Writer {
128 ArrayWriter(
Byte *Buf) : Buf(Buf), BufPos(0) {
135 inline Writer *ReadyWriteStruct(
Byte *vec) {
136 return new ArrayWriter(vec);
138 inline std::size_t
WriteArray(
void *p,
const void *buf,
size_t size) {
139 ArrayWriter *writer = (ArrayWriter*)p;
142 std::memcpy(&writer->Buf[writer->BufPos], buf, size);
143 writer->BufPos+=size;
151 int ReadString(
void *p,
void *buf,
size_t *size);
153 class StringReader :
public Reader {
155 StringReader(
const std::string &Buf) : Buf(Buf), BufPos(0) {
159 const std::string &Buf;
162 inline Reader *ReadyReadStruct(
const std::string &vec) {
163 return new StringReader(vec);
165 inline unsigned long long GetReadSize(
const std::string &vec) {
168 inline void StringSeek(Reader *r,
long long addr) {
169 StringReader *reader=(StringReader *)r;
170 reader->BufPos+=(unsigned)addr;
172 inline std::function<void(Reader*,
long long)> SeekFn(
const std::string &vec) {
175 inline int ReadString(
void *p,
void *buf,
size_t *size) {
176 StringReader *reader = (StringReader*)p;
177 *size = std::min(*size, reader->Buf.size() - reader->BufPos);
179 std::memcpy(buf, &reader->Buf[reader->BufPos], *size);
180 reader->BufPos += *size;
185 std::size_t
WriteString(
void *p,
const void *buf,
size_t size);
186 class StringWriter :
public Writer {
188 StringWriter(std::string &Buf) : Buf(Buf), BufPos(0) {
195 inline Writer *ReadyWriteStruct(std::string &vec) {
196 return new StringWriter(vec);
198 inline std::size_t
WriteString(
void *p,
const void *buf,
size_t size) {
199 StringWriter *writer = (StringWriter*)p;
202 std::size_t oldSize = writer->Buf.size();
203 writer->Buf.resize(oldSize + size);
204 std::memcpy(&writer->Buf[oldSize], buf, size);
211 int ReadFile(
void *p,
void *buf,
size_t *size);
212 unsigned long long GetReadSize(std::istream &f);
213 class FileReader :
public Reader {
215 FileReader(std::istream &Buf) : Buf(Buf) {
221 inline Reader *ReadyReadStruct(std::istream &f) {
222 return new FileReader(f);
224 inline unsigned long long GetReadSize(std::istream &f) {
228 f.seekg(c, std::ios::beg);
231 inline void FileSeek(Reader *r,
long long addr) {
232 FileReader *reader=(FileReader *)r;
233 reader->Buf.seekg(addr, std::ios::cur);
235 inline std::function<void(Reader*,
long long)> SeekFn(std::istream &vec) {
238 inline int ReadFile(
void *p,
void *buf,
size_t *size) {
239 FileReader *reader = (FileReader*)p;
240 reader->Buf.read((
char*)buf, *size);
241 *size=(size_t)reader->Buf.gcount();
242 if(size>0 && reader->Buf.fail())
248 std::size_t
WriteFile(
void *p,
const void *buf,
size_t size);
249 class FileWriter :
public Writer {
251 FileWriter(std::ostream &Buf) : Buf(Buf) {
257 inline Writer *ReadyWriteStruct(std::ostream &f) {
258 return new FileWriter(f);
260 inline std::size_t
WriteFile(
void *p,
const void *buf,
size_t size) {
261 FileWriter *writer = (FileWriter*)p;
262 writer->Buf.write((
char*)buf, size);
292 template <
class I_,
class O_>
294 encode(lzma::ReadyReadStruct(input), lzma::ReadyWriteStruct(output), lzma::GetReadSize(input),
nullptr);
301 template <
class I_,
class O_>
303 encode(lzma::ReadyReadStruct(input), lzma::ReadyWriteStruct(output), lzma::GetReadSize(input), ¬ifier);
316 template <
class I_,
class O_>
317 void Decode(I_ &input, O_ &output,
Byte *compressionproperties=
nullptr,
unsigned long long fsize=(
unsigned long long)(
long long)-1) {
318 decode(lzma::ReadyReadStruct(input), lzma::ReadyWriteStruct(output), lzma::GetReadSize(input), lzma::SeekFn(input), compressionproperties, fsize,
nullptr);
332 template <
class I_,
class O_>
334 decode(lzma::ReadyReadStruct(input), lzma::ReadyWriteStruct(output), lzma::GetReadSize(input), lzma::SeekFn(input), compressionproperties, fsize, ¬ifier);
348 void decode(lzma::Reader *reader, lzma::Writer *writer,
unsigned long long size, std::function<
void(lzma::Reader*,
long long)> seekfn,
Byte *cprops,
unsigned long long fsize,
ProgressNotification *notifier);