Контракты для корутин

Олег Власов
Олег Власов

Хочется что бы можно было использовать контракты в корутинах. Также как с функциями:

task<> tcp_echo_server(socket socket)
[[expects: socket.is_open()]]
 {
  char data[1024];
  for (;;) {
    size_t n = co_await socket.async_read_some(buffer(data));
    co_await async_write(socket, buffer(data, n));
  }
}

Потому что, это даст возможность сообщать разработчику об ограничения работы с данной корутиной. И позволит компилятору оптимизорать работу с ней.

3
рейтинг
5 комментариев
yndx-antoshkka

Спрошу в рассылках, кажется что проблема не обсуждалась.

yndx-antoshkka
Andrey Davydov

А что мешает этому в текущей версии стандарта? Корутины это обычные функции.

Andrey Davydov
yndx-antoshkka

Andrey Davydov, лично мне не очень понятно:
* в какой момент контракт будет проверяться (например если корутина всегда засыпает при входе, когда проверится контракт - при первом пробуждении или при создании корутины)
* действительно ли согласно стандарту они как обычные функции обрабатываются в этом месте.

Надо почитать стандарт.

yndx-antoshkka
Andrey Davydov

yndx-antoshkka, в стандарте очень мало что специфицировано про контракты: http://eel.is/c++draft/dcl.attr.contract. Кажется, что для проверки предъусловия тело функции вообще не нужно, т.е. эти проверки можно вставлять в место вызова, где даже не известно, что вызываемая функция является корутиной.

Andrey Davydov
Andrey Davydov

Поэтому для меня очевидно, что predondition должно проверяться в момент создания корутины, а не в момент первого пробуждения. Скажем корутина пораждаящая генератор не будет пробуждена, если никто не запросит значение из генератора, но это же не значит, что можно нарушать контракт передавая ей на вход любые значения.

А вот с postcondition-м ситуация, действительно, интереснее, так как фраза "A postcondition is checked by evaluating its predicate immediately before returning control to the caller of the function." (http://eel.is/c++draft/dcl.attr.contract#cond-5) с корутинами явно не очень сочетается.

Andrey Davydov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения