You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.6 KiB
139 lines
3.6 KiB
4 months ago
|
// 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 <cstddef>
|
||
|
#include <cstdint>
|
||
|
#include <initializer_list>
|
||
|
#include <vector>
|
||
|
|
||
|
#include "./reader.h"
|
||
|
#include "./status.h"
|
||
|
|
||
|
/**
|
||
|
\file
|
||
|
A `Reader` implementation that reads from a `std::vector<std::uint8_t>`.
|
||
|
*/
|
||
|
|
||
|
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<std::uint8_t> 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<std::uint8_t>& 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<std::uint8_t>&& 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<std::uint8_t> 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<std::uint8_t> data_;
|
||
|
|
||
|
// The position of the reader in the byte buffer.
|
||
|
std::size_t pos_ = 0;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
@}
|
||
|
*/
|
||
|
|
||
|
} // namespace webm
|
||
|
|
||
|
#endif // INCLUDE_WEBM_BUFFER_READER_H_
|