cannam@147
|
1 // Copyright (c) 2014 Sandstorm Development Group, Inc. and contributors
|
cannam@147
|
2 // Licensed under the MIT License:
|
cannam@147
|
3 //
|
cannam@147
|
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
cannam@147
|
5 // of this software and associated documentation files (the "Software"), to deal
|
cannam@147
|
6 // in the Software without restriction, including without limitation the rights
|
cannam@147
|
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
cannam@147
|
8 // copies of the Software, and to permit persons to whom the Software is
|
cannam@147
|
9 // furnished to do so, subject to the following conditions:
|
cannam@147
|
10 //
|
cannam@147
|
11 // The above copyright notice and this permission notice shall be included in
|
cannam@147
|
12 // all copies or substantial portions of the Software.
|
cannam@147
|
13 //
|
cannam@147
|
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
cannam@147
|
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
cannam@147
|
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
cannam@147
|
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
cannam@147
|
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
cannam@147
|
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
cannam@147
|
20 // THE SOFTWARE.
|
cannam@147
|
21
|
cannam@147
|
22 /*
|
cannam@147
|
23 * Compatibility layer for stdlib iostream
|
cannam@147
|
24 */
|
cannam@147
|
25
|
cannam@147
|
26 #ifndef KJ_STD_IOSTREAM_H_
|
cannam@147
|
27 #define KJ_STD_IOSTREAM_H_
|
cannam@147
|
28
|
cannam@147
|
29 #if defined(__GNUC__) && !KJ_HEADER_WARNINGS
|
cannam@147
|
30 #pragma GCC system_header
|
cannam@147
|
31 #endif
|
cannam@147
|
32
|
cannam@147
|
33 #include "../io.h"
|
cannam@147
|
34 #include <iostream>
|
cannam@147
|
35
|
cannam@147
|
36 namespace kj {
|
cannam@147
|
37 namespace std {
|
cannam@147
|
38
|
cannam@147
|
39 class StdOutputStream: public kj::OutputStream {
|
cannam@147
|
40
|
cannam@147
|
41 public:
|
cannam@147
|
42 explicit StdOutputStream(::std::ostream& stream) : stream_(stream) {}
|
cannam@147
|
43 ~StdOutputStream() noexcept(false) {}
|
cannam@147
|
44
|
cannam@147
|
45 virtual void write(const void* src, size_t size) override {
|
cannam@147
|
46 // Always writes the full size.
|
cannam@147
|
47
|
cannam@147
|
48 stream_.write((char*)src, size);
|
cannam@147
|
49 }
|
cannam@147
|
50
|
cannam@147
|
51 virtual void write(ArrayPtr<const ArrayPtr<const byte>> pieces) override {
|
cannam@147
|
52 // Equivalent to write()ing each byte array in sequence, which is what the
|
cannam@147
|
53 // default implementation does. Override if you can do something better,
|
cannam@147
|
54 // e.g. use writev() to do the write in a single syscall.
|
cannam@147
|
55
|
cannam@147
|
56 for (auto piece : pieces) {
|
cannam@147
|
57 write(piece.begin(), piece.size());
|
cannam@147
|
58 }
|
cannam@147
|
59 }
|
cannam@147
|
60
|
cannam@147
|
61 private:
|
cannam@147
|
62 ::std::ostream& stream_;
|
cannam@147
|
63
|
cannam@147
|
64 };
|
cannam@147
|
65
|
cannam@147
|
66 class StdInputStream: public kj::InputStream {
|
cannam@147
|
67
|
cannam@147
|
68 public:
|
cannam@147
|
69 explicit StdInputStream(::std::istream& stream) : stream_(stream) {}
|
cannam@147
|
70 ~StdInputStream() noexcept(false) {}
|
cannam@147
|
71
|
cannam@147
|
72 virtual size_t tryRead(
|
cannam@147
|
73 void* buffer, size_t minBytes, size_t maxBytes) override {
|
cannam@147
|
74 // Like read(), but may return fewer than minBytes on EOF.
|
cannam@147
|
75
|
cannam@147
|
76 stream_.read((char*)buffer, maxBytes);
|
cannam@147
|
77 return stream_.gcount();
|
cannam@147
|
78 }
|
cannam@147
|
79
|
cannam@147
|
80 private:
|
cannam@147
|
81 ::std::istream& stream_;
|
cannam@147
|
82
|
cannam@147
|
83 };
|
cannam@147
|
84
|
cannam@147
|
85 } // namespace std
|
cannam@147
|
86 } // namespace kj
|
cannam@147
|
87
|
cannam@147
|
88 #endif // KJ_STD_IOSTREAM_H_
|