From 1e85893abb93b8673340f7844439fe4deaeda2d8 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Thu, 21 Apr 2022 19:52:46 -0300 Subject: [PATCH] Add new DataStream subclass of Stream, internal-only for now. --- CMakeLists.txt | 2 + src/modules/data/DataStream.cpp | 139 ++++++++++++++++++++++++++++++++ src/modules/data/DataStream.h | 69 ++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 src/modules/data/DataStream.cpp create mode 100644 src/modules/data/DataStream.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a14d0045e..399676783 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -375,6 +375,8 @@ set(LOVE_SRC_MODULE_DATA src/modules/data/Compressor.h src/modules/data/DataModule.cpp src/modules/data/DataModule.h + src/modules/data/DataStream.cpp + src/modules/data/DataStream.h src/modules/data/DataView.cpp src/modules/data/DataView.h src/modules/data/HashFunction.cpp diff --git a/src/modules/data/DataStream.cpp b/src/modules/data/DataStream.cpp new file mode 100644 index 000000000..54962845b --- /dev/null +++ b/src/modules/data/DataStream.cpp @@ -0,0 +1,139 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "DataStream.h" +#include "common/Exception.h" +#include "common/int.h" +#include "common/Data.h" + +#include + +namespace love +{ +namespace data +{ + +love::Type DataStream::type("DataStream", &Stream::type); + +DataStream::DataStream(Data *data) + : data(data) + , offset(0) + , size(data->getSize()) + , memory((const uint8 *) data->getData()) + , writableMemory((uint8 *) data->getData()) // TODO: disallow writing sometimes? +{ +} + +DataStream::DataStream(const DataStream &other) + : data(other.data) + , offset(0) + , size(other.size) + , memory(other.memory) + , writableMemory(other.writableMemory) +{ +} + +DataStream::~DataStream() +{ +} + +DataStream *DataStream::clone() +{ + return new DataStream(*this); +} + +bool DataStream::isReadable() const +{ + return true; +} + +bool DataStream::isWritable() const +{ + return writableMemory != nullptr; +} + +bool DataStream::isSeekable() const +{ + return true; +} + +int64 DataStream::read(void* data, int64 size) +{ + if (size <= 0) + return 0; + + if (offset >= getSize()) + return 0; + + int64 readsize = std::min(size, getSize() - offset); + + memcpy(data, memory + offset, readsize); + + offset += readsize; + return readsize; +} + +bool DataStream::write(const void* data, int64 size) +{ + if (size <= 0 || writableMemory == nullptr) + return false; + + if (offset >= getSize()) + return false; + + int64 writesize = std::min(size, getSize() - offset); + + memcpy(writableMemory + offset, data, writesize); + + offset += writesize; + return true; +} + +bool DataStream::flush() +{ + return true; +} + +int64 DataStream::getSize() +{ + return size; +} + +bool DataStream::seek(int64 pos, SeekOrigin origin) +{ + if (origin == SEEKORIGIN_CURRENT) + pos += offset; + else if (origin == SEEKORIGIN_END) + pos += size; + + if (pos < 0 || pos > size) + return false; + + offset = pos; + return true; +} + +int64 DataStream::tell() +{ + return offset; +} + +} // data +} // love diff --git a/src/modules/data/DataStream.h b/src/modules/data/DataStream.h new file mode 100644 index 000000000..f9247c7e3 --- /dev/null +++ b/src/modules/data/DataStream.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2006-2022 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#pragma once + +#include "common/Stream.h" + +namespace love +{ +namespace data +{ + +class DataStream : public love::Stream +{ +public: + + static love::Type type; + + DataStream(Data *data); + virtual ~DataStream(); + + // Implements Stream. + DataStream *clone() override; + + bool isReadable() const override; + bool isWritable() const override; + bool isSeekable() const override; + + int64 read(void* data, int64 size) override; + bool write(const void* data, int64 size) override; + + bool flush() override; + + int64 getSize() override; + + bool seek(int64 pos, SeekOrigin origin = SEEKORIGIN_BEGIN) override; + int64 tell() override; + +private: + + DataStream(const DataStream &other); + + StrongRef data; + const uint8 *memory; + uint8 *writableMemory; + size_t offset; + size_t size; + +}; // DataStream + +} // data +} // love