diff --git a/libs/io/include/psemek/io/file_stream.hpp b/libs/io/include/psemek/io/file_stream.hpp index 2bce09a7..b71b5beb 100644 --- a/libs/io/include/psemek/io/file_stream.hpp +++ b/libs/io/include/psemek/io/file_stream.hpp @@ -40,6 +40,8 @@ namespace psemek::io std::size_t read(char * p, std::size_t size) override; + bool finished() const override; + ~file_istream() override { reset(); diff --git a/libs/io/include/psemek/io/memory_stream.hpp b/libs/io/include/psemek/io/memory_stream.hpp index e90102cc..988d0ceb 100644 --- a/libs/io/include/psemek/io/memory_stream.hpp +++ b/libs/io/include/psemek/io/memory_stream.hpp @@ -55,6 +55,11 @@ namespace psemek::io std::size_t read(char * p, std::size_t size) override; + bool finished() const override + { + return begin_ == end_; + } + void advance(std::size_t n) { if (end_ - begin_ < n) diff --git a/libs/io/include/psemek/io/stream.hpp b/libs/io/include/psemek/io/stream.hpp index 3c838a0d..88f07fcf 100644 --- a/libs/io/include/psemek/io/stream.hpp +++ b/libs/io/include/psemek/io/stream.hpp @@ -13,6 +13,7 @@ namespace psemek::io { virtual std::size_t read(char * p, std::size_t size) = 0; virtual std::size_t read_all(char * p, std::size_t size); + virtual bool finished() const = 0; virtual ~istream() {} }; diff --git a/libs/io/source/file_stream.cpp b/libs/io/source/file_stream.cpp index 0755c1ae..7c1cc481 100644 --- a/libs/io/source/file_stream.cpp +++ b/libs/io/source/file_stream.cpp @@ -37,6 +37,12 @@ namespace psemek::io return std::fread(p, 1, size, file_); } + bool file_istream::finished() const + { + if (!file_) throw null_istream{}; + return std::feof(file_) != 0; + } + static char const * fopen_write_mode(unsigned flags) { switch (flags)