diff options
| author | Dylan <boss@tehbox.org> | 2026-05-04 18:36:15 +1200 |
|---|---|---|
| committer | Dylan <boss@tehbox.org> | 2026-05-04 18:36:15 +1200 |
| commit | a75bdd0e167140eeb4afb091c9dedd84474c8531 (patch) | |
| tree | 9c94262edc1c1eea4bd4977f76c7cd8ec6a43da1 /src/files.h | |
| parent | 500151be4794923cee6034c26881effeb1bb056d (diff) | |
| download | tehimage-a75bdd0e167140eeb4afb091c9dedd84474c8531.tar.gz tehimage-a75bdd0e167140eeb4afb091c9dedd84474c8531.zip | |
feat: Added a writer class
Also moved both the reader and writer class to the same files, named
files.{cpp,h}
Diffstat (limited to 'src/files.h')
| -rw-r--r-- | src/files.h | 87 |
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; + }; +} |
