| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Streams classes. | 5 // Streams classes. |
| 6 // | 6 // |
| 7 // These memory-resident streams are used for serializing data into a sequential | 7 // These memory-resident streams are used for serializing data into a sequential |
| 8 // region of memory. | 8 // region of memory. |
| 9 // Streams are divided into SourceStreams for reading and SinkStreams for | 9 // Streams are divided into SourceStreams for reading and SinkStreams for |
| 10 // writing. Streams are aggregated into Sets which allows several streams to be | 10 // writing. Streams are aggregated into Sets which allows several streams to be |
| 11 // used at once. Example: we can write A1, B1, A2, B2 but achieve the memory | 11 // used at once. Example: we can write A1, B1, A2, B2 but achieve the memory |
| 12 // layout A1 A2 B1 B2 by writing 'A's to one stream and 'B's to another. | 12 // layout A1 A2 B1 B2 by writing 'A's to one stream and 'B's to another. |
| 13 |
| 13 #ifndef COURGETTE_STREAMS_H_ | 14 #ifndef COURGETTE_STREAMS_H_ |
| 14 #define COURGETTE_STREAMS_H_ | 15 #define COURGETTE_STREAMS_H_ |
| 15 | 16 |
| 17 #include <stddef.h> |
| 18 #include <stdint.h> |
| 16 #include <stdio.h> // for FILE* | 19 #include <stdio.h> // for FILE* |
| 17 #include <string> | 20 #include <string> |
| 18 | 21 |
| 19 #include "base/basictypes.h" | |
| 20 #include "base/compiler_specific.h" | 22 #include "base/compiler_specific.h" |
| 21 | 23 #include "base/macros.h" |
| 22 #include "courgette/memory_allocator.h" | 24 #include "courgette/memory_allocator.h" |
| 23 #include "courgette/region.h" | 25 #include "courgette/region.h" |
| 24 | 26 |
| 25 | 27 |
| 26 namespace courgette { | 28 namespace courgette { |
| 27 | 29 |
| 28 class SourceStream; | 30 class SourceStream; |
| 29 class SinkStream; | 31 class SinkStream; |
| 30 | 32 |
| 31 // Maximum number of streams in a stream set. | 33 // Maximum number of streams in a stream set. |
| 32 static const unsigned int kMaxStreams = 10; | 34 static const unsigned int kMaxStreams = 10; |
| 33 | 35 |
| 34 // A SourceStream allows a region of memory to be scanned by a sequence of Read | 36 // A SourceStream allows a region of memory to be scanned by a sequence of Read |
| 35 // operations. The stream does not own the memory. | 37 // operations. The stream does not own the memory. |
| 36 class SourceStream { | 38 class SourceStream { |
| 37 public: | 39 public: |
| 38 SourceStream() : start_(NULL), end_(NULL), current_(NULL) {} | 40 SourceStream() : start_(NULL), end_(NULL), current_(NULL) {} |
| 39 | 41 |
| 40 // Initializes the SourceStream to yield the bytes at |pointer|. The caller | 42 // Initializes the SourceStream to yield the bytes at |pointer|. The caller |
| 41 // still owns the memory at |pointer| and should free the memory only after | 43 // still owns the memory at |pointer| and should free the memory only after |
| 42 // the last use of the stream. | 44 // the last use of the stream. |
| 43 void Init(const void* pointer, size_t length) { | 45 void Init(const void* pointer, size_t length) { |
| 44 start_ = static_cast<const uint8*>(pointer); | 46 start_ = static_cast<const uint8_t*>(pointer); |
| 45 end_ = start_ + length; | 47 end_ = start_ + length; |
| 46 current_ = start_; | 48 current_ = start_; |
| 47 } | 49 } |
| 48 | 50 |
| 49 // Initializes the SourceStream to yield the bytes in |region|. The caller | 51 // Initializes the SourceStream to yield the bytes in |region|. The caller |
| 50 // still owns the memory at |region| and should free the memory only after | 52 // still owns the memory at |region| and should free the memory only after |
| 51 // the last use of the stream. | 53 // the last use of the stream. |
| 52 void Init(const Region& region) { Init(region.start(), region.length()); } | 54 void Init(const Region& region) { Init(region.start(), region.length()); } |
| 53 | 55 |
| 54 // Initializes the SourceStream to yield the bytes in |string|. The caller | 56 // Initializes the SourceStream to yield the bytes in |string|. The caller |
| 55 // still owns the memory at |string| and should free the memory only after | 57 // still owns the memory at |string| and should free the memory only after |
| 56 // the last use of the stream. | 58 // the last use of the stream. |
| 57 void Init(const std::string& string) { Init(string.c_str(), string.size()); } | 59 void Init(const std::string& string) { Init(string.c_str(), string.size()); } |
| 58 | 60 |
| 59 // Initializes the SourceStream to yield the bytes written to |sink|. |sink| | 61 // Initializes the SourceStream to yield the bytes written to |sink|. |sink| |
| 60 // still owns the memory, so needs to outlive |this|. |sink| should not be | 62 // still owns the memory, so needs to outlive |this|. |sink| should not be |
| 61 // written to after |this| is initialized. | 63 // written to after |this| is initialized. |
| 62 void Init(const SinkStream& sink); | 64 void Init(const SinkStream& sink); |
| 63 | 65 |
| 64 // Returns number of bytes remaining to be read from stream. | 66 // Returns number of bytes remaining to be read from stream. |
| 65 size_t Remaining() const { return end_ - current_; } | 67 size_t Remaining() const { return end_ - current_; } |
| 66 | 68 |
| 67 // Returns initial length of stream before any data consumed by reading. | 69 // Returns initial length of stream before any data consumed by reading. |
| 68 size_t OriginalLength() const { return end_ - start_; } | 70 size_t OriginalLength() const { return end_ - start_; } |
| 69 | 71 |
| 70 const uint8* Buffer() const { return current_; } | 72 const uint8_t* Buffer() const { return current_; } |
| 71 bool Empty() const { return current_ == end_; } | 73 bool Empty() const { return current_ == end_; } |
| 72 | 74 |
| 73 // Copies bytes from stream to memory at |destination|. Returns 'false' if | 75 // Copies bytes from stream to memory at |destination|. Returns 'false' if |
| 74 // insufficient data to satisfy request. | 76 // insufficient data to satisfy request. |
| 75 bool Read(void* destination, size_t byte_count); | 77 bool Read(void* destination, size_t byte_count); |
| 76 | 78 |
| 77 // Reads a varint formatted unsigned integer from stream. Returns 'false' if | 79 // Reads a varint formatted unsigned integer from stream. Returns 'false' if |
| 78 // the read failed due to insufficient data or malformed Varint32. | 80 // the read failed due to insufficient data or malformed Varint32. |
| 79 bool ReadVarint32(uint32* output_value); | 81 bool ReadVarint32(uint32_t* output_value); |
| 80 | 82 |
| 81 // Reads a varint formatted signed integer from stream. Returns 'false' if | 83 // Reads a varint formatted signed integer from stream. Returns 'false' if |
| 82 // the read failed due to insufficient data or malformed Varint32. | 84 // the read failed due to insufficient data or malformed Varint32. |
| 83 bool ReadVarint32Signed(int32* output_value); | 85 bool ReadVarint32Signed(int32_t* output_value); |
| 84 | 86 |
| 85 // Initializes |substream| to yield |length| bytes from |this| stream, | 87 // Initializes |substream| to yield |length| bytes from |this| stream, |
| 86 // starting at |offset| bytes from the current position. Returns 'false' if | 88 // starting at |offset| bytes from the current position. Returns 'false' if |
| 87 // there are insufficient bytes in |this| stream. | 89 // there are insufficient bytes in |this| stream. |
| 88 bool ShareSubstream(size_t offset, size_t length, SourceStream* substream); | 90 bool ShareSubstream(size_t offset, size_t length, SourceStream* substream); |
| 89 | 91 |
| 90 // Initializes |substream| to yield |length| bytes from |this| stream, | 92 // Initializes |substream| to yield |length| bytes from |this| stream, |
| 91 // starting at the current position. Returns 'false' if there are | 93 // starting at the current position. Returns 'false' if there are |
| 92 // insufficient bytes in |this| stream. | 94 // insufficient bytes in |this| stream. |
| 93 bool ShareSubstream(size_t length, SourceStream* substream) { | 95 bool ShareSubstream(size_t length, SourceStream* substream) { |
| 94 return ShareSubstream(0, length, substream); | 96 return ShareSubstream(0, length, substream); |
| 95 } | 97 } |
| 96 | 98 |
| 97 // Reads |length| bytes from |this| stream. Initializes |substream| to yield | 99 // Reads |length| bytes from |this| stream. Initializes |substream| to yield |
| 98 // the bytes. Returns 'false' if there are insufficient bytes in |this| | 100 // the bytes. Returns 'false' if there are insufficient bytes in |this| |
| 99 // stream. | 101 // stream. |
| 100 bool ReadSubstream(size_t length, SourceStream* substream); | 102 bool ReadSubstream(size_t length, SourceStream* substream); |
| 101 | 103 |
| 102 // Skips over bytes. Returns 'false' if insufficient data to satisfy request. | 104 // Skips over bytes. Returns 'false' if insufficient data to satisfy request. |
| 103 bool Skip(size_t byte_count); | 105 bool Skip(size_t byte_count); |
| 104 | 106 |
| 105 private: | 107 private: |
| 106 const uint8* start_; // Points to start of buffer. | 108 const uint8_t* start_; // Points to start of buffer. |
| 107 const uint8* end_; // Points to first location after buffer. | 109 const uint8_t* end_; // Points to first location after buffer. |
| 108 const uint8* current_; // Points into buffer at current read location. | 110 const uint8_t* current_; // Points into buffer at current read location. |
| 109 | 111 |
| 110 DISALLOW_COPY_AND_ASSIGN(SourceStream); | 112 DISALLOW_COPY_AND_ASSIGN(SourceStream); |
| 111 }; | 113 }; |
| 112 | 114 |
| 113 // A SinkStream accumulates writes into a buffer that it owns. The stream is | 115 // A SinkStream accumulates writes into a buffer that it owns. The stream is |
| 114 // initially in an 'accumulating' state where writes are permitted. Accessing | 116 // initially in an 'accumulating' state where writes are permitted. Accessing |
| 115 // the buffer moves the stream into a 'locked' state where no more writes are | 117 // the buffer moves the stream into a 'locked' state where no more writes are |
| 116 // permitted. The stream may also be in a 'retired' state where the buffer | 118 // permitted. The stream may also be in a 'retired' state where the buffer |
| 117 // contents are no longer available. | 119 // contents are no longer available. |
| 118 class SinkStream { | 120 class SinkStream { |
| 119 public: | 121 public: |
| 120 SinkStream() {} | 122 SinkStream() {} |
| 121 ~SinkStream() {} | 123 ~SinkStream() {} |
| 122 | 124 |
| 123 // Appends |byte_count| bytes from |data| to the stream. | 125 // Appends |byte_count| bytes from |data| to the stream. |
| 124 CheckBool Write(const void* data, size_t byte_count) WARN_UNUSED_RESULT; | 126 CheckBool Write(const void* data, size_t byte_count) WARN_UNUSED_RESULT; |
| 125 | 127 |
| 126 // Appends the 'varint32' encoding of |value| to the stream. | 128 // Appends the 'varint32' encoding of |value| to the stream. |
| 127 CheckBool WriteVarint32(uint32 value) WARN_UNUSED_RESULT; | 129 CheckBool WriteVarint32(uint32_t value) WARN_UNUSED_RESULT; |
| 128 | 130 |
| 129 // Appends the 'varint32' encoding of |value| to the stream. | 131 // Appends the 'varint32' encoding of |value| to the stream. |
| 130 CheckBool WriteVarint32Signed(int32 value) WARN_UNUSED_RESULT; | 132 CheckBool WriteVarint32Signed(int32_t value) WARN_UNUSED_RESULT; |
| 131 | 133 |
| 132 // Appends the 'varint32' encoding of |value| to the stream. | 134 // Appends the 'varint32' encoding of |value| to the stream. |
| 133 // On platforms where sizeof(size_t) != sizeof(int32), do a safety check. | 135 // On platforms where sizeof(size_t) != sizeof(int32_t), do a safety check. |
| 134 CheckBool WriteSizeVarint32(size_t value) WARN_UNUSED_RESULT; | 136 CheckBool WriteSizeVarint32(size_t value) WARN_UNUSED_RESULT; |
| 135 | 137 |
| 136 // Contents of |other| are appended to |this| stream. The |other| stream | 138 // Contents of |other| are appended to |this| stream. The |other| stream |
| 137 // becomes retired. | 139 // becomes retired. |
| 138 CheckBool Append(SinkStream* other) WARN_UNUSED_RESULT; | 140 CheckBool Append(SinkStream* other) WARN_UNUSED_RESULT; |
| 139 | 141 |
| 140 // Returns the number of bytes in this SinkStream | 142 // Returns the number of bytes in this SinkStream |
| 141 size_t Length() const { return buffer_.size(); } | 143 size_t Length() const { return buffer_.size(); } |
| 142 | 144 |
| 143 // Returns a pointer to contiguously allocated Length() bytes in the stream. | 145 // Returns a pointer to contiguously allocated Length() bytes in the stream. |
| 144 // Writing to the stream invalidates the pointer. The SinkStream continues to | 146 // Writing to the stream invalidates the pointer. The SinkStream continues to |
| 145 // own the memory. | 147 // own the memory. |
| 146 const uint8* Buffer() const { | 148 const uint8_t* Buffer() const { |
| 147 return reinterpret_cast<const uint8*>(buffer_.data()); | 149 return reinterpret_cast<const uint8_t*>(buffer_.data()); |
| 148 } | 150 } |
| 149 | 151 |
| 150 // Hints that the stream will grow by an additional |length| bytes. | 152 // Hints that the stream will grow by an additional |length| bytes. |
| 151 // Caller must be prepared to handle memory allocation problems. | 153 // Caller must be prepared to handle memory allocation problems. |
| 152 CheckBool Reserve(size_t length) WARN_UNUSED_RESULT { | 154 CheckBool Reserve(size_t length) WARN_UNUSED_RESULT { |
| 153 return buffer_.reserve(length + buffer_.size()); | 155 return buffer_.reserve(length + buffer_.size()); |
| 154 } | 156 } |
| 155 | 157 |
| 156 // Finished with this stream and any storage it has. | 158 // Finished with this stream and any storage it has. |
| 157 void Retire(); | 159 void Retire(); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 CheckBool CopyHeaderTo(SinkStream* stream) WARN_UNUSED_RESULT; | 229 CheckBool CopyHeaderTo(SinkStream* stream) WARN_UNUSED_RESULT; |
| 228 | 230 |
| 229 size_t count_; | 231 size_t count_; |
| 230 SinkStream streams_[kMaxStreams]; | 232 SinkStream streams_[kMaxStreams]; |
| 231 | 233 |
| 232 DISALLOW_COPY_AND_ASSIGN(SinkStreamSet); | 234 DISALLOW_COPY_AND_ASSIGN(SinkStreamSet); |
| 233 }; | 235 }; |
| 234 | 236 |
| 235 } // namespace | 237 } // namespace |
| 236 #endif // COURGETTE_STREAMS_H_ | 238 #endif // COURGETTE_STREAMS_H_ |
| OLD | NEW |