#ifndef IO_HH #define IO_HH #include #include #include #include namespace io { enum class ReadError { Error, Eof, InvalidData, // invalid data read (not used by raw file) MaxTooSmall, // max argument needs to be bigger (not used by raw file) }; enum class OpenError { NoSuchFile, NoAccess, Error, }; class Reader { public: virtual ~Reader() = default; [[nodiscard]] virtual std::expected read(void* dst, size_t max) = 0; [[nodiscard]] virtual std::expected skip(size_t max) = 0; [[nodiscard]] std::expected repeat_read(void* dst, size_t max); [[nodiscard]] std::expected repeat_skip(size_t max); protected: Reader() = default; Reader(Reader const&) = delete; Reader& operator=(Reader const&) = delete; }; [[nodiscard]] std::expected, OpenError> open( const std::string& file_path); [[nodiscard]] std::expected, OpenError> openat( int dirfd, const std::string& file_path); [[nodiscard]] std::unique_ptr memory(std::string data); } // namespace io #endif // IO_HH