diff options
Diffstat (limited to 'src/stream.h')
-rw-r--r-- | src/stream.h | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/src/stream.h b/src/stream.h index 666d830b..5fa3443d 100644 --- a/src/stream.h +++ b/src/stream.h @@ -22,7 +22,6 @@ #include <vector> #include "src/common.h" -#include "src/writer.h" namespace wabt { @@ -35,7 +34,7 @@ enum class PrintChars { class Stream { public: - Stream(Writer* writer, Stream* log_stream = nullptr); + Stream(Stream* log_stream = nullptr); size_t offset() { return offset_; } Result result() { return result_; } @@ -117,55 +116,82 @@ class Stream { WriteU8(static_cast<uint32_t>(value), desc, print_chars); } + protected: + virtual Result WriteDataImpl(size_t offset, + const void* data, + size_t size) = 0; + virtual Result MoveDataImpl(size_t dst_offset, + size_t src_offset, + size_t size) = 0; + private: template <typename T> void Write(const T& data, const char* desc, PrintChars print_chars) { WriteData(&data, sizeof(data), desc, print_chars); } - Writer* writer_; // Not owned. size_t offset_; Result result_; // Not owned. If non-null, log all writes to this stream. Stream* log_stream_; }; +struct OutputBuffer { + Result WriteToFile(string_view filename) const; + + size_t size() const { return data.size(); } + + std::vector<uint8_t> data; +}; + class MemoryStream : public Stream { public: WABT_DISALLOW_COPY_AND_ASSIGN(MemoryStream); - MemoryStream(); + explicit MemoryStream(Stream* log_stream = nullptr); + explicit MemoryStream(std::unique_ptr<OutputBuffer>&&, + Stream* log_stream = nullptr); - MemoryWriter& writer() { return writer_; } - - std::unique_ptr<OutputBuffer> ReleaseOutputBuffer() { - return writer_.ReleaseOutputBuffer(); - } + OutputBuffer& output_buffer() { return *buf_; } + std::unique_ptr<OutputBuffer> ReleaseOutputBuffer(); Result WriteToFile(string_view filename) { - return writer_.output_buffer().WriteToFile(filename); + return buf_->WriteToFile(filename); } + protected: + Result WriteDataImpl(size_t offset, const void* data, size_t size) override; + Result MoveDataImpl(size_t dst_offset, + size_t src_offset, + size_t size) override; + private: - MemoryWriter writer_; + std::unique_ptr<OutputBuffer> buf_; }; class FileStream : public Stream { public: WABT_DISALLOW_COPY_AND_ASSIGN(FileStream); - explicit FileStream(string_view filename); - explicit FileStream(FILE*); + explicit FileStream(string_view filename, Stream* log_stream = nullptr); + explicit FileStream(FILE*, Stream* log_stream = nullptr); FileStream(FileStream&&); FileStream& operator=(FileStream&&); - - FileWriter& writer() { return writer_; } + ~FileStream(); static std::unique_ptr<FileStream> CreateStdout(); static std::unique_ptr<FileStream> CreateStderr(); - bool is_open() const { return writer_.is_open(); } + bool is_open() const { return file_ != nullptr; } + + protected: + Result WriteDataImpl(size_t offset, const void* data, size_t size) override; + Result MoveDataImpl(size_t dst_offset, + size_t src_offset, + size_t size) override; private: - FileWriter writer_; + FILE* file_; + size_t offset_; + bool should_close_; }; } // namespace wabt |