mirror of
https://github.com/NixOS/nix
synced 2025-06-28 22:01:15 +02:00
decompress(): Use a Source and Sink
This allows decompression to happen in O(1) memory.
This commit is contained in:
parent
64441f0551
commit
3e6b194d78
6 changed files with 210 additions and 91 deletions
|
@ -56,7 +56,7 @@ struct Source
|
|||
void operator () (unsigned char * data, size_t len);
|
||||
|
||||
/* Store up to ‘len’ in the buffer pointed to by ‘data’, and
|
||||
return the number of bytes stored. If blocks until at least
|
||||
return the number of bytes stored. It blocks until at least
|
||||
one byte is available. */
|
||||
virtual size_t read(unsigned char * data, size_t len) = 0;
|
||||
|
||||
|
@ -175,6 +175,22 @@ struct TeeSource : Source
|
|||
};
|
||||
|
||||
|
||||
/* Convert a function into a sink. */
|
||||
struct LambdaSink : Sink
|
||||
{
|
||||
typedef std::function<void(const unsigned char *, size_t)> lambda_t;
|
||||
|
||||
lambda_t lambda;
|
||||
|
||||
LambdaSink(const lambda_t & lambda) : lambda(lambda) { }
|
||||
|
||||
virtual void operator () (const unsigned char * data, size_t len)
|
||||
{
|
||||
lambda(data, len);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void writePadding(size_t len, Sink & sink);
|
||||
void writeString(const unsigned char * buf, size_t len, Sink & sink);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue