Задача «Арифметическое кодирование»

Задача

Произвести рефакторинг кода на C, реализующего алгоритм адаптивного арифметического кодирования.

Исходный код

Листинги с исходным кодом приведены в статье 'Arithmetic coding for data compression'.

  • arithmetic_coding.h – общий интерфейс для модулей арифметического кодирования.
  • model.h – общий интерфейс для модулей статистических моделей.
  • arithmetic_encode.c – реализация функций кодирования.
  • arithmetic_decode.c – реализация функций декодирования.
  • bit_input.c – модуль побитового чтения из файла.
  • bit_output.c – модуль побитовой записи в файл.
  • encode.c – программа, кодирующая данные из stdin и выдающая результат в stdout.
  • decode.c – программа, декодирующая данные из stdin и выдающая результат в stdout..
  • adaptive_model.c – реализация адаптивной статистической модели.
  • fixed_model.c – реализация статистической модели с фиксированным распределением символов по частоте.

Весь код написан на одном из старых диалектов C, но тем не менее, успешно собирается современными компиляторами.

Описание

В процессе рефакторинга необходимо:

  • Переписать код на C++ (объявление переменных не в начале блока, а там где они реально используются, и т. п.)
  • Объединить 4 проекта в один. В результате должна получится одна программа, работающая в нескольких режимах: кодирование / декодирование, адаптивная / фиксированная статистическая модель.
  • Избавиться от define'ов (объявление констант) и глобальных переменных.
  • Обработку ошибок перенести на механизм исключений и std::exception.
  • Выделить классы битовых потоков, глобальные функции для работы с побитовым вводом / выводом преобразовать в методы или операторы.
  • Выделить классы статистических моделей.
  • Выделить класс арифметического кодера.
  • Взаимодействие классов статистических моделей с классом арифметического кодера организовать на основе паттерна стратегия.
  • На дополнительный бал: Подумать на тему превращения всего класса кодера в шаблонный, где параметрами шаблона будут типы данных для символов и кодов. В исходном коде сделана жесткая привязка к символам типа char и кодам типа long.

Архив с проектами для Visual Studio 2013 и Visual Studio 2015.

В проекты добавлен заголовочный файл binary_mode.h с удобным макросом для переключения потока ввода/вывода в бинарный режим (нет в оригинальной статье, необходим для корректной работы под Windows).

Также в проекты добавлен cmd-скрипт для тестирования программ на наборе файлов.