diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarBuffer.hpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/core/StarBuffer.hpp')
-rw-r--r-- | source/core/StarBuffer.hpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/source/core/StarBuffer.hpp b/source/core/StarBuffer.hpp new file mode 100644 index 0000000..a92138b --- /dev/null +++ b/source/core/StarBuffer.hpp @@ -0,0 +1,122 @@ +#ifndef STAR_BUFFER_HPP +#define STAR_BUFFER_HPP + +#include "StarIODevice.hpp" +#include "StarString.hpp" + +namespace Star { + +STAR_CLASS(Buffer); +STAR_CLASS(ExternalBuffer); + +// Wraps a ByteArray to an IODevice +class Buffer : public IODevice { +public: + // Constructs buffer open ReadWrite + Buffer(); + Buffer(size_t initialSize); + Buffer(ByteArray b); + Buffer(Buffer const& buffer); + Buffer(Buffer&& buffer); + + StreamOffset pos() override; + void seek(StreamOffset pos, IOSeek mode = IOSeek::Absolute) override; + void resize(StreamOffset size) override; + bool atEnd() override; + + size_t read(char* data, size_t len) override; + size_t write(char const* data, size_t len) override; + + size_t readAbsolute(StreamOffset readPosition, char* data, size_t len) override; + size_t writeAbsolute(StreamOffset writePosition, char const* data, size_t len) override; + + void open(IOMode mode) override; + + String deviceName() const override; + + StreamOffset size() override; + + ByteArray& data(); + ByteArray const& data() const; + + // If this class holds the underlying data, then this method is cheap, and + // will move the data out of this class into the returned array, otherwise, + // this will incur a copy. Afterwards, this Buffer will be left empty. + ByteArray takeData(); + + // Returns a pointer to the beginning of the Buffer. + char* ptr(); + char const* ptr() const; + + // Same thing as size(), just size_t type (since this is in-memory) + size_t dataSize() const; + void reserve(size_t size); + + // Clears buffer, moves position to 0. + void clear(); + bool empty() const; + + // Reset buffer with new contents, moves position to 0. + void reset(size_t newSize); + void reset(ByteArray b); + + Buffer& operator=(Buffer const& buffer); + Buffer& operator=(Buffer&& buffer); + +private: + size_t doRead(size_t pos, char* data, size_t len); + size_t doWrite(size_t pos, char const* data, size_t len); + + size_t m_pos; + ByteArray m_bytes; +}; + +// Wraps an externally held sequence of bytes to a read-only IODevice +class ExternalBuffer : public IODevice { +public: + // Constructs an empty ReadOnly ExternalBuffer. + ExternalBuffer(); + // Constructs a ReadOnly ExternalBuffer pointing to the given external data, which + // must be valid for the lifetime of the ExternalBuffer. + ExternalBuffer(char const* externalData, size_t len); + + ExternalBuffer(ExternalBuffer const& buffer) = default; + ExternalBuffer& operator=(ExternalBuffer const& buffer) = default; + + StreamOffset pos() override; + void seek(StreamOffset pos, IOSeek mode = IOSeek::Absolute) override; + bool atEnd() override; + + size_t read(char* data, size_t len) override; + size_t write(char const* data, size_t len) override; + + size_t readAbsolute(StreamOffset readPosition, char* data, size_t len) override; + size_t writeAbsolute(StreamOffset writePosition, char const* data, size_t len) override; + + String deviceName() const override; + + StreamOffset size() override; + + // Returns a pointer to the beginning of the Buffer. + char const* ptr() const; + + // Same thing as size(), just size_t type (since this is in-memory) + size_t dataSize() const; + + // Clears buffer, moves position to 0. + bool empty() const; + + // Reset buffer with new contents, moves position to 0. + void reset(char const* externalData, size_t len); + +private: + size_t doRead(size_t pos, char* data, size_t len); + + size_t m_pos; + char const* m_bytes; + size_t m_size; +}; + +} + +#endif |