Mercurial > hg > sv-dependency-builds
comparison win64-msvc/include/capnp/serialize-packed.h @ 47:d93140aac40b
Current Capnp libs and headers from git
author | Chris Cannam |
---|---|
date | Thu, 20 Oct 2016 18:15:38 +0100 |
parents | |
children | 0f2d93caa50c |
comparison
equal
deleted
inserted
replaced
46:efe5b9f38b13 | 47:d93140aac40b |
---|---|
1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors | |
2 // Licensed under the MIT License: | |
3 // | |
4 // Permission is hereby granted, free of charge, to any person obtaining a copy | |
5 // of this software and associated documentation files (the "Software"), to deal | |
6 // in the Software without restriction, including without limitation the rights | |
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 // copies of the Software, and to permit persons to whom the Software is | |
9 // furnished to do so, subject to the following conditions: | |
10 // | |
11 // The above copyright notice and this permission notice shall be included in | |
12 // all copies or substantial portions of the Software. | |
13 // | |
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
20 // THE SOFTWARE. | |
21 | |
22 #ifndef CAPNP_SERIALIZE_PACKED_H_ | |
23 #define CAPNP_SERIALIZE_PACKED_H_ | |
24 | |
25 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS) | |
26 #pragma GCC system_header | |
27 #endif | |
28 | |
29 #include "serialize.h" | |
30 | |
31 namespace capnp { | |
32 | |
33 namespace _ { // private | |
34 | |
35 class PackedInputStream: public kj::InputStream { | |
36 // An input stream that unpacks packed data with a picky constraint: The caller must read data | |
37 // in the exact same size and sequence as the data was written to PackedOutputStream. | |
38 | |
39 public: | |
40 explicit PackedInputStream(kj::BufferedInputStream& inner); | |
41 KJ_DISALLOW_COPY(PackedInputStream); | |
42 ~PackedInputStream() noexcept(false); | |
43 | |
44 // implements InputStream ------------------------------------------ | |
45 size_t tryRead(void* buffer, size_t minBytes, size_t maxBytes) override; | |
46 void skip(size_t bytes) override; | |
47 | |
48 private: | |
49 kj::BufferedInputStream& inner; | |
50 }; | |
51 | |
52 class PackedOutputStream: public kj::OutputStream { | |
53 public: | |
54 explicit PackedOutputStream(kj::BufferedOutputStream& inner); | |
55 KJ_DISALLOW_COPY(PackedOutputStream); | |
56 ~PackedOutputStream() noexcept(false); | |
57 | |
58 // implements OutputStream ----------------------------------------- | |
59 void write(const void* buffer, size_t bytes) override; | |
60 | |
61 private: | |
62 kj::BufferedOutputStream& inner; | |
63 }; | |
64 | |
65 } // namespace _ (private) | |
66 | |
67 class PackedMessageReader: private _::PackedInputStream, public InputStreamMessageReader { | |
68 public: | |
69 PackedMessageReader(kj::BufferedInputStream& inputStream, ReaderOptions options = ReaderOptions(), | |
70 kj::ArrayPtr<word> scratchSpace = nullptr); | |
71 KJ_DISALLOW_COPY(PackedMessageReader); | |
72 ~PackedMessageReader() noexcept(false); | |
73 }; | |
74 | |
75 class PackedFdMessageReader: private kj::FdInputStream, private kj::BufferedInputStreamWrapper, | |
76 public PackedMessageReader { | |
77 public: | |
78 PackedFdMessageReader(int fd, ReaderOptions options = ReaderOptions(), | |
79 kj::ArrayPtr<word> scratchSpace = nullptr); | |
80 // Read message from a file descriptor, without taking ownership of the descriptor. | |
81 // Note that if you want to reuse the descriptor after the reader is destroyed, you'll need to | |
82 // seek it, since otherwise the position is unspecified. | |
83 | |
84 PackedFdMessageReader(kj::AutoCloseFd fd, ReaderOptions options = ReaderOptions(), | |
85 kj::ArrayPtr<word> scratchSpace = nullptr); | |
86 // Read a message from a file descriptor, taking ownership of the descriptor. | |
87 | |
88 KJ_DISALLOW_COPY(PackedFdMessageReader); | |
89 | |
90 ~PackedFdMessageReader() noexcept(false); | |
91 }; | |
92 | |
93 void writePackedMessage(kj::BufferedOutputStream& output, MessageBuilder& builder); | |
94 void writePackedMessage(kj::BufferedOutputStream& output, | |
95 kj::ArrayPtr<const kj::ArrayPtr<const word>> segments); | |
96 // Write a packed message to a buffered output stream. | |
97 | |
98 void writePackedMessage(kj::OutputStream& output, MessageBuilder& builder); | |
99 void writePackedMessage(kj::OutputStream& output, | |
100 kj::ArrayPtr<const kj::ArrayPtr<const word>> segments); | |
101 // Write a packed message to an unbuffered output stream. If you intend to write multiple messages | |
102 // in succession, consider wrapping your output in a buffered stream in order to reduce system | |
103 // call overhead. | |
104 | |
105 void writePackedMessageToFd(int fd, MessageBuilder& builder); | |
106 void writePackedMessageToFd(int fd, kj::ArrayPtr<const kj::ArrayPtr<const word>> segments); | |
107 // Write a single packed message to the file descriptor. | |
108 | |
109 size_t computeUnpackedSizeInWords(kj::ArrayPtr<const byte> packedBytes); | |
110 // Computes the number of words to which the given packed bytes will unpack. Not intended for use | |
111 // in performance-sensitive situations. | |
112 | |
113 // ======================================================================================= | |
114 // inline stuff | |
115 | |
116 inline void writePackedMessage(kj::BufferedOutputStream& output, MessageBuilder& builder) { | |
117 writePackedMessage(output, builder.getSegmentsForOutput()); | |
118 } | |
119 | |
120 inline void writePackedMessage(kj::OutputStream& output, MessageBuilder& builder) { | |
121 writePackedMessage(output, builder.getSegmentsForOutput()); | |
122 } | |
123 | |
124 inline void writePackedMessageToFd(int fd, MessageBuilder& builder) { | |
125 writePackedMessageToFd(fd, builder.getSegmentsForOutput()); | |
126 } | |
127 | |
128 } // namespace capnp | |
129 | |
130 #endif // CAPNP_SERIALIZE_PACKED_H_ |