// Copyright (c) 2002 David Muse
// See the COPYING file for more information.
#ifndef RUDIMENTS_VARIABLEBUFFER_H
#define RUDIMENTS_VARIABLEBUFFER_H
#include <rudiments/private/variablebufferincludes.h>
// The variablebuffer class can be used to store raw data of arbitrary length.
#ifdef RUDIMENTS_NAMESPACE
namespace rudiments {
#endif
class variablebufferprivate;
class variablebuffer {
public:
variablebuffer(size_t initialsize, size_t increment);
variablebuffer(unsigned char *initialcontents,
size_t initialsize, size_t increment);
// Creates a new buffer of size "initialsize"
// which will grow in chunks of size "increment".
// The position at which the first write or append
// will occur is initialized to 0.
variablebuffer(const variablebuffer &v);
variablebuffer &operator=(const variablebuffer &v);
virtual ~variablebuffer();
void setPosition(size_t pos);
// Sets the position at which the next read or write
// will occur to "pos". If the position is set beyond
// the end of the buffer, the buffer will grow but the
// data between the current end of the buffer and the
// new position will be undefined.
// The write() and append() methods return a pointer to the
// variablebuffer instance. This enables chaining:
//
// sb->write(data1)->write(data2)->write(data3);
// or
// sb->append(data1)->append(data2)->append(data3);
variablebuffer *write(const unsigned char *data, size_t size);
variablebuffer *write(const char *string);
variablebuffer *write(const char *string, size_t size);
variablebuffer *write(char character);
variablebuffer *write(int16_t number);
variablebuffer *write(int32_t number);
variablebuffer *write(int64_t number);
variablebuffer *write(unsigned char character);
variablebuffer *write(uint16_t number);
variablebuffer *write(uint32_t number);
variablebuffer *write(uint64_t number);
variablebuffer *write(float number);
variablebuffer *write(double number);
// Writes "data" to the variablebuffer at the current
// position. If necessary, the buffer will grow to
// accommodate the new data.
variablebuffer *append(const unsigned char *data, size_t size);
variablebuffer *append(const char *string);
variablebuffer *append(const char *string, size_t size);
variablebuffer *append(char character);
variablebuffer *append(int16_t number);
variablebuffer *append(int32_t number);
variablebuffer *append(int64_t number);
variablebuffer *append(unsigned char character);
variablebuffer *append(uint16_t number);
variablebuffer *append(uint32_t number);
variablebuffer *append(uint64_t number);
variablebuffer *append(float number);
variablebuffer *append(double number);
// Appends "data" to the variablebuffer. The buffer
// will grow to accommodate the new data.
ssize_t read(unsigned char *data, size_t size);
// Reads "size" bytes from the variablebuffer at the
// current position into "data". Also increments the
// current position by "size" bytes.
void clear();
// Empties the variablebuffer.
const unsigned char *getBuffer();
// Returns the current data stored in the
// variablebuffer.
size_t getSize();
// Returns the current amount of data stored
// in the variablebuffer.
size_t getPosition();
// Returns the position in the buffer at which
// the next write will occur.
size_t getEnd();
// Returns the position in the buffer at which
// the next append will occur.
size_t getActualSize();
// Returns the actual size of the buffer which
// may be larger than the value returned by
// getSize() since the buffer grows in chunks.
unsigned char *detachBuffer();
// Returns a pointer to the buffer currently
// stored in the variablebuffer, then resets
// the variablebuffer such that it will no
// longer use that buffer.
//
// The calling program must deallocate the
// buffer returned from this method.
#include <rudiments/private/variablebuffer.h>
};
#ifdef RUDIMENTS_NAMESPACE
}
#endif
#endif