Привет!
Мне кажется все последние годы я что-то писал прям в то время, пока все нормальные люди отмечают Новый год. Это прям традиция какая-то. Собственно, большая часть базовой функциональности Codeforces была написана в новогодние праздники 2010-го года: авторизация, блоги, базовая поддержка соревнований.
Возможно, я хочу провести и следующий год с интересом что-то улучшая в инфраструктуре Codeforces (да-да, как Новый год встретишь — так его и проведёшь). А может просто в Новый год вроде работать не обязательно и делаешь не то, что вот прям сейчас надо, а то, что хорошо бы когда-нибудь сделать.
В этот раз я выделил чуток времени, чтобы добавить в testlib поддержку разбора параметров командной строки. Мне очень не нравится в генераторах писать такое int n = atoi(argv[3]);. Собственно по нескольким причинам:
- небезопасно к тому, что 3-го параметра командной строки может и не быть;
- небезопасно к тому, что 3-й параметр командной строки может не оказаться корректным 32-х битным целым числом.
Теперь вместо этого следует писать так: int n = opt<int>(3);. Кроме того, вы может писать и такое int64_t m = opt<int64_t>(1);, такое bool t = opt<bool>(2); или даже string s = opt(4);.
Кроме того, я поддержал именованные параметры. Если параметров слишком много, то запись g 10 20000 a true менее читаемая чем g -n10 -m200000 -t=a -increment.
В таком случае теперь вы можете использовать такие сниппеты кода в вашем генераторе:
int n = opt<int>("n");
long long n = opt<long long>("m");
string t = opt("t");
bool increment = opt<bool>("increment");
Вы можете свободно смешивать чтение параметров по индексу и по именам.
Поддерживаются следующие варианты записи именнованных параметров:
--key=valueили-key=value;--key valueили-key value— еслиvalueне является стартом нового параметра (не начинается с дефиса или после одного/двух дефисов не идёт буква);--k12345или-k12345— если ключkэто одна буква и затем идёт цифра;-propили--prop— для включения булевских свойств.
Ниже записаны примеры для запуска нескольких вымышленных генераторов:
g1 -n1
g2 --len=4 --s=oops
g3 -inc -shuffle -n 5
g4 --length 5 --total 21 -ord
Возможно, я в торопях написал что-то не очень удачно или даже с багами. Предлагаю вам посмотреть в мои последние коммиты. Буду рад дельным предложениям или фиксам.
Спасибо за внимание.
А какие у вас есть традиции на Новый год?








Смена хэндла




вы увидите код с выделенной проблемной строкой и описание возможной ошибки.




