about summary refs log tree commit diff
path: root/src/base/tl/stream.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/tl/stream.hpp')
-rw-r--r--src/base/tl/stream.hpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/base/tl/stream.hpp b/src/base/tl/stream.hpp
new file mode 100644
index 00000000..c307b968
--- /dev/null
+++ b/src/base/tl/stream.hpp
@@ -0,0 +1,65 @@
+#ifndef TL_FILE_STREAM_HPP
+#define TL_FILE_STREAM_HPP
+
+class input_stream
+{
+public:	
+	virtual ~input_stream() {}
+	virtual size_t read(void *data, size_t size) = 0;
+	virtual size_t size() = 0;
+};
+
+class output_stream
+{
+public:	
+	virtual ~output_stream() {}
+	virtual size_t write(const void *data, size_t size) = 0;
+};
+
+
+// input wrapping
+// RAII style
+class file_backend
+{
+private:
+	file_backend(const file_backend &other) { /* no copy allowed */ }
+protected:
+	IOHANDLE file_handle;
+	
+	explicit file_backend(const char *filename, int flags)
+	{
+		file_handle = io_open(filename, flags);
+	}
+	
+	~file_backend()
+	{
+		if(file_handle)
+			io_close(file_handle);
+	}
+public:
+	bool is_open() const { return file_handle != 0; }
+};
+
+class file_reader : public input_stream, public file_backend
+{
+public:	
+	explicit file_reader(const char *filename)
+	: file_backend(filename, IOFLAG_READ)
+	{}
+	
+	virtual size_t read(void *data, size_t size) { return io_read(file_handle, data, size); }
+	virtual size_t size() { return io_length(file_handle); }
+};
+
+
+class file_writer : public output_stream, public file_backend
+{
+public:	
+	explicit file_writer(const char *filename)
+	: file_backend(filename, IOFLAG_WRITE)
+	{}
+	
+	virtual size_t write(const void *data, size_t size) { return io_write(file_handle, data, size); }
+};
+
+#endif