#ifndef __MEM_FILE_H__ #define __MEM_FILE_H__ #include<iostream> #include<fstream> #include<string> #include<cstring> namespace mem { class MemFile { public: MemFile() = default; MemFile(const MemFile &f) = delete; MemFile &operator=(const MemFile &f) = delete; MemFile &operator=(MemFile &&f) = delete; MemFile(MemFile &&f) = delete; bool open(const std::string &filename) { mode = 0; _memory = nullptr; _size = 0; _open = false; file.open(filename, std::ios::in | std::ios::out | std::ios::binary); if(!file.is_open()) return false; file.seekg(0, std::ios::end); _size = file.tellg(); file.seekg(0, std::ios::beg); _open = true; offset = 0; return true; } bool is_open() const { return _open; } bool eof() { if(mode == 0) return file.eof(); return (offset > _size); } bool open(void *mem, unsigned long size) { mode = 1; _memory = mem; _size = size; _open = true; offset = 0; return true; } unsigned long read(void *buf, unsigned long size) { if(mode == 0) { file.read((char*)buf, size); return file.gcount(); } else { memcpy(buf, ((char*)_memory+offset), size); offset += size; return size; } return 0; } void write(void *buf, unsigned long size) { if(mode == 0) { file.write((char*)buf, size); } else { memcpy(((char*)_memory+offset), buf, size); offset += size; } } void rewind() { if(mode == 1)offset = 0; else file.seekg(0, std::ios::beg); } void close() { if(mode == 0) { file.close(); _open = false; } else if(mode == 1) { _memory = nullptr; _size = 0; _open = false; } } protected: void *_memory; unsigned long _size,offset; std::fstream file; bool _open; int mode; }; } #endif