| // Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors |
| // Licensed under the MIT License: |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a copy |
| // of this software and associated documentation files (the "Software"), to deal |
| // in the Software without restriction, including without limitation the rights |
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| // copies of the Software, and to permit persons to whom the Software is |
| // furnished to do so, subject to the following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included in |
| // all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| // THE SOFTWARE. |
| |
| /* |
| * Compatibility layer for stdlib iostream |
| */ |
| |
| #pragma once |
| |
| #include "../io.h" |
| #include <iostream> |
| |
| KJ_BEGIN_HEADER |
| |
| namespace kj { |
| namespace std { |
| |
| class StdOutputStream: public kj::OutputStream { |
| |
| public: |
| explicit StdOutputStream(::std::ostream& stream) : stream_(stream) {} |
| ~StdOutputStream() noexcept(false) {} |
| |
| virtual void write(const void* src, size_t size) override { |
| // Always writes the full size. |
| |
| stream_.write((char*)src, size); |
| } |
| |
| virtual void write(ArrayPtr<const ArrayPtr<const byte>> pieces) override { |
| // Equivalent to write()ing each byte array in sequence, which is what the |
| // default implementation does. Override if you can do something better, |
| // e.g. use writev() to do the write in a single syscall. |
| |
| for (auto piece : pieces) { |
| write(piece.begin(), piece.size()); |
| } |
| } |
| |
| private: |
| ::std::ostream& stream_; |
| |
| }; |
| |
| class StdInputStream: public kj::InputStream { |
| |
| public: |
| explicit StdInputStream(::std::istream& stream) : stream_(stream) {} |
| ~StdInputStream() noexcept(false) {} |
| |
| virtual size_t tryRead( |
| void* buffer, size_t minBytes, size_t maxBytes) override { |
| // Like read(), but may return fewer than minBytes on EOF. |
| |
| stream_.read((char*)buffer, maxBytes); |
| return stream_.gcount(); |
| } |
| |
| private: |
| ::std::istream& stream_; |
| |
| }; |
| |
| } // namespace std |
| } // namespace kj |
| |
| KJ_END_HEADER |