Тестовое задание для iOS C++ разработчика

Вакансии

Необходимо разработать приложение для iOS (минимальная версия iOS — 11.0):

  1. Пользователь вводит URL текстового файла, фильтр отбора строк и запускает загрузку (например нажатие кнопки).
  2. Приложение подгружает файл, отбирает строки удовлетворяющие фильтру и отображает их ввиде списка.


Принцип отбора строк:

Предполагается что текстовый файл является текстовым ANSI файлом (закладываться на UTF-8 не нужно).

Отбор строк осуществляется по условиям простейшего regexp: (как минимум операторы * и ?):

  • cимвол '*' - последовательность любых символов неограниченной длины;
  • cимвол "?" - один любой символ;
  • должны корректно отрабатываться маски: *Some*, *Some, Some*, *****Some*** - нет никаких ограничений на положение * в маске.


Результатом поиска должны быть строки, удовлетворяющие маске.

Например:

  1. Маска *abc*  отбирает все строки содержащие abc и начинающиеся и заканчивающиеся любой последовательностью символов.
  2. Маска abc*  отбирает все строки начинающиеся с abc и заканчивающиеся любой последовательностью символов.
  3. Маска abc?  отбирает все строки начинающиеся с abc и заканчивающиеся любым дополнительным символом.
  4. Маска abc   отбирает все строки которые равны этой маске.


Требования к реализации:

  1. Отбор строк должен быть реализован на С++ в составе отдельного класса.  Класс не будет расширяться и не будет базовым классом. Единственная задача: сканирование и поиск текстовых строк. При реализации С++ части запрещено использование сторонних библиотек и STL. В частности запрещено использовать <regex> и <ifstream>. Весь парсинг должен быть реализован на С++.

    Класс должен иметь следующий публичный интерфейс:

    class CLogReader
      {
    public:
               CLogReader(...);
              ~CLogReader(...);

       bool    SetFilter(const char *filter);   // установка фильтра строк, false - ошибка

       bool    AddSourceBlock(const char* block,const size_t block_size); // добавление очередного блока текстового файла
      };

    Способ передачи результирующих строк в Objective C, остаётся на усмотрение автора.

  2. Размер исходного текстового файла (и, возможно, результатов) может быть от сотен мегабайт.
  3. Для реализации загрузки и отображения данных должен использоваться Objective C. Использование Swift запрещено.
  4. Запрещено использование ARC (Automatic Reference Counting).
  5. Затраты памяти должны быть минимальны (в разумных пределах);
  6. Результаты парсинга должны писаться в файл results.log в каталоге приложения
  7. Код должен быть абсолютно «неубиваемый» и защищённым от ошибок.


Требования к оформлению:

  1. Код должен быть максимально простым;
  2. Код должен быть максимально чистым, красивым и понятным;
  3. Результатом должен быть готовый проект приложения в ZIP архиве.