// 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_ISTREAM_READER_H_ #define INCLUDE_WEBM_ISTREAM_READER_H_ #include #include #include #include #include #include "./reader.h" #include "./status.h" /** \file A `Reader` implementation that reads from a `std::istream`. */ namespace webm { /** A `Reader` implementation that can read from `std::istream`-based resources. */ class IstreamReader : public Reader { public: /** Constructs a new, empty reader. */ IstreamReader() = default; /** Constructs a new reader, using the provided `std::istream` as the data source. Ownership of the stream is taken, and it will be moved into a new internal instance. \param istream The stream to use as a data source. Must be an rvalue reference derived from `std::istream`. */ template explicit IstreamReader(T&& istream) : istream_(new T(std::move(istream))) {} /** 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. */ IstreamReader(IstreamReader&& other); /** 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`. */ IstreamReader& operator=(IstreamReader&& other); 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; /** Constructs a new reader and its data source in place. `T` must be derived from `std::istream` and constructible from the provided arguments. \param args Arguments that will be forwarded to the `T`'s constructor. \return A new `IstreamReader` backed by the underlying data source equivalent to `T(std::forward(args)...`. */ template static IstreamReader Emplace(Args&&... args) { IstreamReader reader; reader.istream_.reset(new T(std::forward(args)...)); return reader; } private: std::unique_ptr istream_; std::uint64_t position_ = 0; }; } // namespace webm #endif // INCLUDE_WEBM_ISTREAM_READER_H_