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/StarDataStreamDevices.hpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/core/StarDataStreamDevices.hpp')
-rw-r--r-- | source/core/StarDataStreamDevices.hpp | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/source/core/StarDataStreamDevices.hpp b/source/core/StarDataStreamDevices.hpp new file mode 100644 index 0000000..88ee0e9 --- /dev/null +++ b/source/core/StarDataStreamDevices.hpp @@ -0,0 +1,249 @@ +#ifndef STAR_DATA_STREAM_BUFFER_HPP +#define STAR_DATA_STREAM_BUFFER_HPP + +#include "StarBuffer.hpp" +#include "StarDataStream.hpp" + +namespace Star { + +// Implements DataStream using function objects as implementations of read/write. +class DataStreamFunctions : public DataStream { +public: + // Either reader or writer can be unset, if unset then the readData/writeData + // implementations will throw DataStreamException as unimplemented. + DataStreamFunctions(function<size_t(char*, size_t)> reader, function<size_t(char const*, size_t)> writer); + + void readData(char* data, size_t len) override; + void writeData(char const* data, size_t len) override; + +private: + function<size_t(char*, size_t)> m_reader; + function<size_t(char const*, size_t)> m_writer; +}; + +class DataStreamIODevice : public DataStream { +public: + DataStreamIODevice(IODevicePtr device); + + IODevicePtr const& device() const; + + void seek(size_t pos, IOSeek seek = IOSeek::Absolute); + bool atEnd(); + StreamOffset pos(); + + void readData(char* data, size_t len) override; + void writeData(char const* data, size_t len) override; + +private: + IODevicePtr m_device; +}; + +class DataStreamBuffer : public DataStream { +public: + // Convenience methods to serialize to / from ByteArray directly without + // having to construct a temporary DataStreamBuffer to do it + + template <typename T> + static ByteArray serialize(T const& t); + + template <typename T> + static ByteArray serializeContainer(T const& t); + + template <typename T, typename WriteFunction> + static ByteArray serializeContainer(T const& t, WriteFunction writeFunction); + + template <typename T> + static ByteArray serializeMapContainer(T const& t); + + template <typename T, typename WriteFunction> + static ByteArray serializeMapContainer(T const& t, WriteFunction writeFunction); + + template <typename T> + static void deserialize(T& t, ByteArray data); + + template <typename T> + static void deserializeContainer(T& t, ByteArray data); + + template <typename T, typename ReadFunction> + static void deserializeContainer(T& t, ByteArray data, ReadFunction readFunction); + + template <typename T> + static void deserializeMapContainer(T& t, ByteArray data); + + template <typename T, typename ReadFunction> + static void deserializeMapContainer(T& t, ByteArray data, ReadFunction readFunction); + + template <typename T> + static T deserialize(ByteArray data); + + template <typename T> + static T deserializeContainer(ByteArray data); + + template <typename T, typename ReadFunction> + static T deserializeContainer(ByteArray data, ReadFunction readFunction); + + template <typename T> + static T deserializeMapContainer(ByteArray data); + + template <typename T, typename ReadFunction> + static T deserializeMapContainer(ByteArray data, ReadFunction readFunction); + + DataStreamBuffer(); + DataStreamBuffer(size_t initialSize); + DataStreamBuffer(ByteArray b); + + // Resize existing buffer to new size. + void resize(size_t size); + void reserve(size_t size); + void clear(); + + ByteArray& data(); + ByteArray const& data() const; + ByteArray takeData(); + + char* ptr(); + char const* ptr() const; + + BufferPtr const& device() const; + + size_t size() const; + bool empty() const; + + void seek(size_t pos, IOSeek seek = IOSeek::Absolute); + bool atEnd(); + size_t pos(); + + // Set new buffer. + void reset(size_t newSize); + void reset(ByteArray b); + + void readData(char* data, size_t len) override; + void writeData(char const* data, size_t len) override; + +private: + BufferPtr m_buffer; +}; + +class DataStreamExternalBuffer : public DataStream { +public: + DataStreamExternalBuffer(); + DataStreamExternalBuffer(char const* externalData, size_t len); + + char const* ptr() const; + + size_t size() const; + bool empty() const; + + void seek(size_t pos, IOSeek mode = IOSeek::Absolute); + bool atEnd(); + size_t pos(); + + void reset(char const* externalData, size_t len); + +private: + ExternalBuffer m_buffer; +}; + +template <typename T> +ByteArray DataStreamBuffer::serialize(T const& t) { + DataStreamBuffer ds; + ds.write(t); + return ds.takeData(); +} + +template <typename T> +ByteArray DataStreamBuffer::serializeContainer(T const& t) { + DataStreamBuffer ds; + ds.writeContainer(t); + return ds.takeData(); +} + +template <typename T, typename WriteFunction> +ByteArray DataStreamBuffer::serializeContainer(T const& t, WriteFunction writeFunction) { + DataStreamBuffer ds; + ds.writeContainer(t, writeFunction); + return ds.takeData(); +} + +template <typename T> +ByteArray DataStreamBuffer::serializeMapContainer(T const& t) { + DataStreamBuffer ds; + ds.writeMapContainer(t); + return ds.takeData(); +} + +template <typename T, typename WriteFunction> +ByteArray DataStreamBuffer::serializeMapContainer(T const& t, WriteFunction writeFunction) { + DataStreamBuffer ds; + ds.writeMapContainer(t, writeFunction); + return ds.takeData(); +} + +template <typename T> +void DataStreamBuffer::deserialize(T& t, ByteArray data) { + DataStreamBuffer ds(move(data)); + ds.read(t); +} + +template <typename T> +void DataStreamBuffer::deserializeContainer(T& t, ByteArray data) { + DataStreamBuffer ds(move(data)); + ds.readContainer(t); +} + +template <typename T, typename ReadFunction> +void DataStreamBuffer::deserializeContainer(T& t, ByteArray data, ReadFunction readFunction) { + DataStreamBuffer ds(move(data)); + ds.readContainer(t, readFunction); +} + +template <typename T> +void DataStreamBuffer::deserializeMapContainer(T& t, ByteArray data) { + DataStreamBuffer ds(move(data)); + ds.readMapContainer(t); +} + +template <typename T, typename ReadFunction> +void DataStreamBuffer::deserializeMapContainer(T& t, ByteArray data, ReadFunction readFunction) { + DataStreamBuffer ds(move(data)); + ds.readMapContainer(t, readFunction); +} + +template <typename T> +T DataStreamBuffer::deserialize(ByteArray data) { + T t; + deserialize(t, move(data)); + return t; +} + +template <typename T> +T DataStreamBuffer::deserializeContainer(ByteArray data) { + T t; + deserializeContainer(t, move(data)); + return t; +} + +template <typename T, typename ReadFunction> +T DataStreamBuffer::deserializeContainer(ByteArray data, ReadFunction readFunction) { + T t; + deserializeContainer(t, move(data), readFunction); + return t; +} + +template <typename T> +T DataStreamBuffer::deserializeMapContainer(ByteArray data) { + T t; + deserializeMapContainer(t, move(data)); + return t; +} + +template <typename T, typename ReadFunction> +T DataStreamBuffer::deserializeMapContainer(ByteArray data, ReadFunction readFunction) { + T t; + deserializeMapContainer(t, move(data), readFunction); + return t; +} + +} + +#endif |