Блок задач

3. Простые классы

Сложность 2

Задача «Простой поточный RLE-компрессор/декомпрессор»

Реализовать класс RleCodec, простое сжатие/разжатие данных с помощью алгоритма RLE. Простой класс, по сути FIFO'шка, принимающая байты данных, и выдающая по запросу сжатые байты потока. Аналогично в обратном направлении.

Постановка задачи

Реализовать класс RleCodec . public и protected методы классов фиксированы, кроме спецификаторов. Т.е. нельзя менять названия методов, а также типы и количество аргументов. НО в этих методах отсутствуют спецификаторы const и static, которые были удалены намеренно. Их необходимо вернуть на место.

private поля и private методы можно добавлять в класс RleCodec.

//RleCodec.hpp
class RleCodec {
public:
  RleCodec();
  RleCodec(size_t size);
  ~RleCodec();
  RleCodec(const RleCodec&) = delete;
  RleCodec& operator=(const RleCodec&) = delete;

  size_t push_compress(const char* data, size_t size);
  size_t pop_compress(const char* buff, size_t size);

  size_t push_decompress(const char* data, size_t size);
  size_t pop_decompress(const char* buff, size_t size);

protected:
  const size_t c_default_size = 1024;

};
  • RleCodec() -- Конструктор по умолчанию, задаёт длину буфера по умолчанию.
  • RleCodec(size_t size) -- Конструктор задающий длину буфера.
  • ~RleCodec() -- деструктор.
  • RleCodec(const RleCodec& val) = delete -- запрет копирующего конструктора.
  • RleCodec& operator=(const RleCodec&) = delete -- запрет оператора присваивания

  • size_t push_compress(const char* data, size_t size) -- передать (протолкнуть) на сжатие очередную порцию данных. Читает из входного буфера данные, сжимает их, записывает сжатые данные в пустое место внутреннего буфера. Возвращает количество забранных из буфера байт. Если задан размер внутреннего буфера равный нулю(0), то ничего не делает и возвращает ноль(0).

  • size_t pop_compress(const char* buff, size_t size) -- забрать (вытолкнуть) сжатые данные из буфера. Копирует данные из внутреннего буфера. Возвращает количество записанных в буфер байт.

  • size_t push_decompress(const char* data, size_t size) -- передать (протолкнуть) на разжатие очередную порцию данных. Читает из входного буфера данные, разжимает их, записывает разжатые данные в пустое место внутреннего буфера. Возвращает количество забранных из буфера байт. Если задан размер внутреннего буфера равный нулю(0), то ничего не делает и возвращает ноль(0).

  • size_t pop_decompress(const char* buff, size_t size) -- забрать (вытолкнуть) разжатые данные из буфера. Копирует данные из внутреннего буфера. Возвращает количество записанных в буфер байт.

  • const size_t c_default_size = 1024 -- Длина внутреннего буфера по умолчанию.

Требования

  1. public и protected методы классов фиксированы. Т.е. нельзя менять названия методов, а также типы и количество аргументов.
  2. Названия header и source файлов следующие: RleCodec.hpp, RleCodec.cpp.
  3. Написать unit test'ы для реализованных классов.