Skip to content

Написание собственного reader'а

AlexeyDmitriev edited this page Dec 16, 2012 · 10 revisions

Ридер - это класс, который должен быть наследником Reader<T>, где T - тип данных, который он читает.

Он должен содержать один или несколько методов вида T read(InStream&, Args...) const.

Пример простого ридера:

class PalindromeReader: public Reader<std::string> {
    std::string read(IStream& stream, int maxLen) const {
        std::string res = stream.read(maxLen);
        if(!std::equal(res.begin(), res.end(), res.rbegin()))
            stream.quit(Verdict::PE, expectation("palindrome", res));
        return res;
    }
};

Пожалуйста, используйте stream.quit(verdict, message) для выхода(сообщения об ошибке). Тогда если поток не является выводом участника, то вердикт будет автоматически изменяться на FAIL.

Системой предполагается, что:

  • один класс не является ридером сразу нескольких типов.
  • все методы read константные (const после аргументов функции).
  • объекты достаточно легковесны (повсюду передаются по значению). Лучше, если они вообще не содержат состояния.

Не забывайте, что внутри ридеров вы можете использовать:

  • другие ридеры.
  • методы чтения из [IStream](General Documentation#wiki-IStream).
  • IStream::getMode() для определения, в строгом или не строгом режиме находится поток. В зависимости от этого можно по-разному обрабатывать, например, пробелы. Пример использования - стандартный Reader<std::vector>.