| namespace util { | |
| namespace stream { | |
| /** | |
| * Encapsulates a block of memory. | |
| */ | |
| class Block { | |
| public: | |
| /** | |
| * Constructs an empty block. | |
| */ | |
| Block() : mem_(NULL), valid_size_(0) {} | |
| /** | |
| * Constructs a block that encapsulates a segment of memory. | |
| * | |
| * @param[in] mem The segment of memory to encapsulate | |
| * @param[in] size The size of the memory segment in bytes | |
| */ | |
| Block(void *mem, std::size_t size) : mem_(mem), valid_size_(size) {} | |
| /** | |
| * Set the number of bytes in this block that should be interpreted as valid. | |
| * | |
| * @param[in] to Number of bytes | |
| */ | |
| void SetValidSize(std::size_t to) { valid_size_ = to; } | |
| /** | |
| * Gets the number of bytes in this block that should be interpreted as valid. | |
| * This is important because read might fill in less than Allocated at EOF. | |
| */ | |
| std::size_t ValidSize() const { return valid_size_; } | |
| /** Gets a void pointer to the memory underlying this block. */ | |
| void *Get() { return mem_; } | |
| /** Gets a const void pointer to the memory underlying this block. */ | |
| const void *Get() const { return mem_; } | |
| /** | |
| * Gets a const void pointer to the end of the valid section of memory | |
| * encapsulated by this block. | |
| */ | |
| const void *ValidEnd() const { | |
| return reinterpret_cast<const uint8_t*>(mem_) + valid_size_; | |
| } | |
| /** | |
| * Returns true if this block encapsulates a valid (non-NULL) block of memory. | |
| * | |
| * This method is a user-defined implicit conversion function to boolean; | |
| * among other things, this method enables bare instances of this class | |
| * to be used as the condition of an if statement. | |
| */ | |
| operator bool() const { return mem_ != NULL; } | |
| /** | |
| * Returns true if this block is empty. | |
| * | |
| * In other words, if Get()==NULL, this method will return true. | |
| */ | |
| bool operator!() const { return mem_ == NULL; } | |
| private: | |
| friend class Link; | |
| friend class RewindableStream; | |
| /** | |
| * Points this block's memory at NULL. | |
| * | |
| * This class defines poison as a block whose memory pointer is NULL. | |
| */ | |
| void SetToPoison() { | |
| mem_ = NULL; | |
| } | |
| void *mem_; | |
| std::size_t valid_size_; | |
| }; | |
| } // namespace stream | |
| } // namespace util | |