Browse Source

Add new DataStream subclass of Stream, internal-only for now.

Alex Szpakowski 3 years ago
parent
commit
1e85893abb
3 changed files with 210 additions and 0 deletions
  1. 2 0
      CMakeLists.txt
  2. 139 0
      src/modules/data/DataStream.cpp
  3. 69 0
      src/modules/data/DataStream.h

+ 2 - 0
CMakeLists.txt

@@ -375,6 +375,8 @@ set(LOVE_SRC_MODULE_DATA
 	src/modules/data/Compressor.h
 	src/modules/data/Compressor.h
 	src/modules/data/DataModule.cpp
 	src/modules/data/DataModule.cpp
 	src/modules/data/DataModule.h
 	src/modules/data/DataModule.h
+	src/modules/data/DataStream.cpp
+	src/modules/data/DataStream.h
 	src/modules/data/DataView.cpp
 	src/modules/data/DataView.cpp
 	src/modules/data/DataView.h
 	src/modules/data/DataView.h
 	src/modules/data/HashFunction.cpp
 	src/modules/data/HashFunction.cpp

+ 139 - 0
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 <algorithm>
+
+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<int64>(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<int64>(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

+ 69 - 0
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> data;
+	const uint8 *memory;
+	uint8 *writableMemory;
+	size_t offset;
+	size_t size;
+
+}; // DataStream
+
+} // data
+} // love