aboutsummaryrefslogtreecommitdiff
path: root/src/files.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/files.h')
-rw-r--r--src/files.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/files.h b/src/files.h
new file mode 100644
index 0000000..fbbe8b7
--- /dev/null
+++ b/src/files.h
@@ -0,0 +1,87 @@
+#pragma once
+
+#include <cstdint>
+#include <string>
+
+#define READER_BUFFER_SIZE 4096
+
+#define DEFINE_INT_READER(TYPE) \
+ template<> TYPE Reader::readData<TYPE>() \
+ { \
+ TYPE in, out; \
+ readBytes((char*)&in, sizeof(TYPE)); \
+ convertEndian((uint8_t*)&in, (uint8_t*)&out, sizeof(TYPE), fileEndianness); \
+ return out; \
+ } \
+
+
+#define DEFINE_INT_WRITER(TYPE) \
+ template <> void Writer::writeData(TYPE toWrite) \
+ { \
+ TYPE converted; \
+ convertEndian((uint8_t*)&toWrite, (uint8_t*)&converted, sizeof(TYPE), fileEndianness); \
+ writeBytes((char*)&converted, sizeof(TYPE)); \
+ } \
+
+namespace TehImage
+{
+ enum FileEndianness
+ {
+ NO_CONVERT,
+ LITTLE,
+ BIG
+ };
+
+ void convertEndian(uint8_t* in, uint8_t* out, std::size_t bytes, FileEndianness target);
+
+ class Reader
+ {
+ public:
+ //Bytes are big endian
+ Reader(std::string file, FileEndianness fileEndianness);
+ ~Reader();
+
+ template <typename T>
+ T readData();
+
+ char readByte();
+
+ void readBytes(char* out, std::size_t len);
+
+ void skipBytes(std::size_t len);
+
+ void close();
+ private:
+ char buffer[READER_BUFFER_SIZE];
+ std::size_t pos;
+ FILE* file;
+ bool ready = false;
+ FileEndianness fileEndianness;
+
+ void refreshBuffer();
+ };
+
+ class Writer
+ {
+ public:
+ //Bytes are big endian
+ Writer(std::string filename, FileEndianness fileEndianness);
+ ~Writer();
+
+ template <typename T>
+ void writeData(T toWrite);
+
+ void writeByte(char toWrite);
+
+ void writeBytes(char toWrite[], std::size_t len);
+
+ void zeroBytes(std::size_t len);
+
+ void close();
+ private:
+ /* std::size_t pos; */
+ FILE* file;
+ bool ready = false;
+ FileEndianness fileEndianness;
+ };
+}