| Index: third_party/courgette/streams.h
|
| ===================================================================
|
| --- third_party/courgette/streams.h (revision 15668)
|
| +++ third_party/courgette/streams.h (working copy)
|
| @@ -1,220 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Streams classes.
|
| -//
|
| -// These memory-resident streams are used for serialzing data into a sequential
|
| -// region of memory.
|
| -// Streams are divided into SourceStreams for reading and SinkStreams for
|
| -// writing. Streams are aggregated into Sets which allows several streams to be
|
| -// used at once. Example: we can write A1, B1, A2, B2 but achive the memory
|
| -// layout A1 A2 B1 B2 by writing 'A's to one stream and 'B's to another.
|
| -#ifndef COURGETTE_STREAMS_H_
|
| -#define COURGETTE_STREAMS_H_
|
| -
|
| -#include <stdio.h> // for FILE*
|
| -#include <string>
|
| -
|
| -#include "base/basictypes.h"
|
| -
|
| -#include "third_party/courgette/region.h"
|
| -
|
| -namespace courgette {
|
| -
|
| -class SourceStream;
|
| -class SinkStream;
|
| -
|
| -// Maximum number of streams in a stream set.
|
| -static const unsigned int kMaxStreams = 10;
|
| -
|
| -// A SourceStream allows a region of memory to be scanned by a sequence of Read
|
| -// operations. The stream does not own the memory.
|
| -class SourceStream {
|
| - public:
|
| - SourceStream() : start_(NULL), end_(NULL), current_(NULL) {}
|
| -
|
| - // Initializes the SourceStream to yield the bytes at |pointer|. The caller
|
| - // still owns the memory at |pointer| and should free the memory only after
|
| - // the last use of the stream.
|
| - void Init(const void* pointer, size_t length) {
|
| - start_ = static_cast<const uint8*>(pointer);
|
| - end_ = start_ + length;
|
| - current_ = start_;
|
| - }
|
| -
|
| - // Initializes the SourceStream to yield the bytes in |region|. The caller
|
| - // still owns the memory at |region| and should free the memory only after
|
| - // the last use of the stream.
|
| - void Init(const Region& region) { Init(region.start(), region.length()); }
|
| -
|
| - // Initializes the SourceStream to yield the bytes in |string|. The caller
|
| - // still owns the memory at |string| and should free the memory only after
|
| - // the last use of the stream.
|
| - void Init(const std::string& string) { Init(string.c_str(), string.size()); }
|
| -
|
| - // Initializes the SourceStream to yield the bytes written to |sink|. |sink|
|
| - // still owns the memory, so needs to outlive |this|. |sink| should not be
|
| - // written to after |this| is initialized.
|
| - void Init(const SinkStream& sink);
|
| -
|
| - // Returns number of bytes remaining to be read from stream.
|
| - size_t Remaining() const { return end_ - current_; }
|
| -
|
| - // Returns initial length of stream before any data consumed by reading.
|
| - size_t OriginalLength() const { return end_ - start_; }
|
| -
|
| - const uint8* Buffer() const { return current_; }
|
| - bool Empty() const { return current_ == end_; }
|
| -
|
| - // Copies bytes from stream to memory at |destination|. Returns 'false' if
|
| - // insufficient data to satisfy request.
|
| - bool Read(void* destination, size_t byte_count);
|
| -
|
| - // Reads a varint formatted unsigned integer from stream. Returns 'false' if
|
| - // the read failed due to insufficient data or malformed Varint32.
|
| - bool ReadVarint32(uint32* output_value);
|
| -
|
| - // Reads a varint formatted signed integer from stream. Returns 'false' if
|
| - // the read failed due to insufficient data or malformed Varint32.
|
| - bool ReadVarint32Signed(int32* output_value);
|
| -
|
| - // Initializes |substream| to yield |length| bytes from |this| stream,
|
| - // starting at |offset| bytes from the current position. Returns 'false' if
|
| - // there are insufficient bytes in |this| stream.
|
| - bool ShareSubstream(size_t offset, size_t length, SourceStream* substream);
|
| -
|
| - // Initializes |substream| to yield |length| bytes from |this| stream,
|
| - // starting at the current position. Returns 'false' if there are
|
| - // insufficient bytes in |this| stream.
|
| - bool ShareSubstream(size_t length, SourceStream* substream) {
|
| - return ShareSubstream(0, length, substream);
|
| - }
|
| -
|
| - // Reads |length| bytes from |this| stream. Initializes |substream| to yield
|
| - // the bytes. Returns 'false' if there are insufficient bytes in |this|
|
| - // stream.
|
| - bool ReadSubstream(size_t length, SourceStream* substream);
|
| -
|
| - // Skips over bytes. Returns 'false' if insufficient data to satisfy request.
|
| - bool Skip(size_t byte_count);
|
| -
|
| - private:
|
| - const uint8* start_; // Points to start of buffer.
|
| - const uint8* end_; // Points to first location after buffer.
|
| - const uint8* current_; // Points into buffer at current read location.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SourceStream);
|
| -};
|
| -
|
| -// A SinkStream accumulates writes into a buffer that it owns. The stream is
|
| -// initialy in an 'accumulating' state where writes are permitted. Accessing
|
| -// the buffer moves the stream into a 'locked' state where no more writes are
|
| -// permitted. The stream may also be in a 'retired' state where the buffer
|
| -// contents are no longer available.
|
| -class SinkStream {
|
| - public:
|
| - SinkStream() {}
|
| - ~SinkStream() {}
|
| -
|
| - // Appends |byte_count| bytes from |data| to the stream.
|
| - void Write(const void* data, size_t byte_count);
|
| -
|
| - // Appends the 'varint32' encoding of |value| to the stream.
|
| - void WriteVarint32(uint32 value);
|
| -
|
| - // Appends the 'varint32' encoding of |value| to the stream.
|
| - void WriteVarint32Signed(int32 value);
|
| -
|
| - // Contents of |other| are appended to |this| stream. The |other| stream
|
| - // becomes retired.
|
| - void Append(SinkStream* other);
|
| -
|
| - // Returns the number of bytes in this SinkStream
|
| - size_t Length() const { return buffer_.size(); }
|
| -
|
| - // Returns a pointer to contiguously allocated Length() bytes in the stream.
|
| - // Writing to the stream invalidates the pointer. The SinkStream continues to
|
| - // own the memory.
|
| - const uint8* Buffer() const {
|
| - return reinterpret_cast<const uint8*>(buffer_.c_str());
|
| - }
|
| -
|
| - // Hints that the stream will grow by an additional |length| bytes.
|
| - void Reserve(size_t length) { buffer_.reserve(length + buffer_.length()); }
|
| -
|
| - private:
|
| - std::string buffer_; // Use a string to manage the stream's memory.
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SinkStream);
|
| -};
|
| -
|
| -// A SourceStreamSet is a set of SourceStreams.
|
| -class SourceStreamSet {
|
| - public:
|
| - SourceStreamSet();
|
| - ~SourceStreamSet();
|
| -
|
| - // Initializes the SourceStreamSet with the stream data in memory at |source|.
|
| - // The caller continues to own the memory and should not modify or free the
|
| - // memory until the SourceStreamSet destructor has been called.
|
| - //
|
| - // The layout of the streams are as written by SinkStreamSet::CopyTo.
|
| - // Init returns 'false' if the layout is inconsistent with |byte_count|.
|
| - bool Init(const void* source, size_t byte_count);
|
| -
|
| - // Initializes |this| from |source|. The caller continues to own the memory
|
| - // because it continues to be owned by |source|.
|
| - bool Init(SourceStream* source);
|
| -
|
| - // Returns a pointer to one of the sub-streams.
|
| - SourceStream* stream(size_t id) { return id < count_ ? &streams_[id] : NULL; }
|
| -
|
| - // Initialize |set| from |this|.
|
| - bool ReadSet(SourceStreamSet* set);
|
| -
|
| - // Returns 'true' if all streams are completely consumed.
|
| - bool Empty() const;
|
| -
|
| - private:
|
| - size_t count_;
|
| - SourceStream streams_[kMaxStreams];
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SourceStreamSet);
|
| -};
|
| -
|
| -class SinkStreamSet {
|
| - public:
|
| - SinkStreamSet();
|
| - ~SinkStreamSet();
|
| -
|
| - // Initializes the SinkStreamSet to have |stream_index_limit| streams. Must
|
| - // be <= kMaxStreams. If Init is not called the default is has kMaxStream.
|
| - void Init(size_t stream_index_limit);
|
| -
|
| - // Returns a pointer to a substream.
|
| - SinkStream* stream(size_t id) { return id < count_ ? &streams_[id] : NULL; }
|
| -
|
| - // CopyTo serializes the streams in the SinkStreamSet into a single target
|
| - // stream or file. The serialized format may be re-read by initializing a
|
| - // SourceStreamSet with a buffer containing the data.
|
| - bool CopyTo(SinkStream* combined_stream);
|
| - bool CopyToFile(FILE* file);
|
| - bool CopyToFileDescriptor(int file_descriptor);
|
| -
|
| - // Writes the streams of |set| into the corresponding streams of |this|.
|
| - // Stream zero first has some metadata written to it. |set| becomes retired.
|
| - // Partner to SourceStreamSet::ReadSet.
|
| - bool WriteSet(SinkStreamSet* set);
|
| -
|
| - private:
|
| - void CopyHeaderTo(SinkStream* stream);
|
| -
|
| - size_t count_;
|
| - SinkStream streams_[kMaxStreams];
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SinkStreamSet);
|
| -};
|
| -
|
| -} // namespace
|
| -#endif // COURGETTE_STREAMS_H_
|
|
|