// Copyright (c) 2016 The WebM project authors. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. #ifndef INCLUDE_WEBM_BUFFER_READER_H_ #define INCLUDE_WEBM_BUFFER_READER_H_ #include #include #include #include #include "./reader.h" #include "./status.h" /** \file A `Reader` implementation that reads from a `std::vector`. */ namespace webm { /** \addtogroup PUBLIC_API @{ */ /** A simple reader that reads data from a buffer of bytes. */ class BufferReader : public Reader { public: /** Constructs a new, empty reader. */ BufferReader() = default; /** Constructs a new reader by copying the provided reader into the new reader. \param other The source reader to copy. */ BufferReader(const BufferReader& other) = default; /** Copies the provided reader into this reader. \param other The source reader to copy. May be equal to `*this`, in which case this is a no-op. \return `*this`. */ BufferReader& operator=(const BufferReader& other) = default; /** Constructs a new reader by moving the provided reader into the new reader. \param other The source reader to move. After moving, it will be reset to an empty stream. */ BufferReader(BufferReader&&); /** Moves the provided reader into this reader. \param other The source reader to move. After moving, it will be reset to an empty stream. May be equal to `*this`, in which case this is a no-op. \return `*this`. */ BufferReader& operator=(BufferReader&&); /** Creates a new `BufferReader` populated with the provided bytes. \param bytes Bytes that are assigned to the internal buffer and used as the source which is read from. */ BufferReader(std::initializer_list bytes); /** Creates a new `BufferReader` populated with the provided data. \param vector A vector of bytes that is copied to the internal buffer and used as the source which is read from. */ explicit BufferReader(const std::vector& vector); /** Creates a new `BufferReader` populated with the provided data. \param vector A vector of bytes that is moved to the internal buffer and used as the source which is read from. */ explicit BufferReader(std::vector&& vector); /** Resets the reader to read from the given list of bytes, starting at the beginning. This makes `reader = {1, 2, 3};` effectively equivalent to `reader = BufferReader({1, 2, 3});`. \param bytes Bytes that are assigned to the internal buffer and used as the source which is read from. \return `*this`. */ BufferReader& operator=(std::initializer_list bytes); Status Read(std::size_t num_to_read, std::uint8_t* buffer, std::uint64_t* num_actually_read) override; Status Skip(std::uint64_t num_to_skip, std::uint64_t* num_actually_skipped) override; std::uint64_t Position() const override; /** Gets the total size of the buffer. */ std::size_t size() const { return data_.size(); } private: // Stores the byte buffer from which data is read. std::vector data_; // The position of the reader in the byte buffer. std::size_t pos_ = 0; }; /** @} */ } // namespace webm #endif // INCLUDE_WEBM_BUFFER_READER_H_