Были ли попытки обернуть асинхронный ввод-вывод WinAPI в классы C++?
Сам сейчас этим занимаюсь. Кстати, возникает вопрос: можно ли тут разместить вопрос, который не совсем вопрос, а скорее призыв к обсуждению и участию в небольшом проекте, а под ответами подразумеваются сообщения об ошибках, глюках, и просто глупостях и предложения оптимизации.
Параллельно с библиотекой async будет писаться статья по асинхронному вводу-выводу и выкладываться исходник.
И если уж такая пьянка, есть проблема: нужен контейнер, который не выделяет память под каждый объект (в отличие от list), но быстро удаляет элементы в произвольной позиции (в отличии от vector, deque). Быстрое добавление только в конец подойдёт. Быстрый поиск - плюс, но не обязательный.
Вообще, на мой взгляд качественный асинхронный код без монад, которые я даже не представляю как организовать в C++ (аналогично тому, что я видел в F# или Nemerle), невозможен.
Но проблемы есть. С утра выложу наброски кода. Код частично работоспособен (проверялся).
Код во вложении.
Коммент: там инклюдится boost/smart_ptr.hpp - из известной библиотеки, найти её можно по адресу boost.org, а #include "general.h" подключает класс Event - обёртку винапишных Event'ов.
Сначала хотел сделать ещё и CompletionPort, теперь решил от них отказаться...
П.С. добавляю код-пример использования, правда, там версия, где ещё был CompletionPort
О существующих библиотеках С++ для работы с асинхронными сокетами?
Да, такие библиотеки есть. Тот же Boost.Asio. Есть и другие.
Если вопрос о специфичном контейнере, "который не выделяет память под каждый объект", то надо смотреть в сторону пулов. На сколько я помню std::stack обладает чем-то похожим, но надо проверить. Ну и опять же Boost Pool Library.
Ну и про overlapped. Структура связана в данном случае с сокетом. Создали сокет - создали и структуру для него, убили сокет - убили и соотв. структуру.
Вторая часть: контейнер нужен хитрый и нестандартный - организация памяти как у вектора/стека/дека (выделение памяти только при расширении), функциональность как у листа (возможность удалить из середины без физического сдвига объектов).
Третья часть: выложен код, просьба глянуть и прокомментировать.