Задача «Арифметическое кодирование»
Задача
Произвести рефакторинг кода на 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-скрипт для тестирования программ на наборе файлов.