-
Notifications
You must be signed in to change notification settings - Fork 0
Написание собственного 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>
.