#ifndef TEST_UTILS_LIMITED_READER_H_
#define TEST_UTILS_LIMITED_READER_H_
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <memory>
#include "webm/reader.h"
#include "webm/status.h"
namespace webm {
class LimitedReader : public Reader {
public:
LimitedReader() = delete;
LimitedReader(const LimitedReader&) = delete;
LimitedReader& operator=(const LimitedReader&) = delete;
LimitedReader(LimitedReader&&) = default;
LimitedReader& operator=(LimitedReader&&) = default;
explicit LimitedReader(std::unique_ptr<Reader> impl);
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;
void set_return_status_when_blocked(Status status);
void set_single_read_limit(std::size_t max_num_bytes);
void set_single_skip_limit(std::uint64_t max_num_bytes);
void set_total_read_limit(std::size_t max_num_bytes);
void set_total_skip_limit(std::uint64_t max_num_bytes);
void set_total_read_skip_limit(std::uint64_t max_num_bytes);
private:
std::size_t single_read_limit_ = std::numeric_limits<std::size_t>::max();
std::uint64_t single_skip_limit_ = std::numeric_limits<std::uint64_t>::max();
std::size_t total_read_limit_ = std::numeric_limits<std::size_t>::max();
std::uint64_t total_skip_limit_ = std::numeric_limits<std::uint64_t>::max();
std::uint64_t total_read_skip_limit_ =
std::numeric_limits<std::uint64_t>::max();
Status return_status_when_blocked_ = Status(Status::kWouldBlock);
std::unique_ptr<Reader> impl_;
};
}
#endif