Склонируйте репозиторий, проинициализируйте подмодуль, соберите через CMake. На Linux:
git clone https://github.com/sergey-shambir/cpp-promise-demo.git
git submodule update --init
cmake -DCMAKE_BUILD_TYPE=Release .
cmake --build .
На Windows с Visual Studio 2017:
git clone https://github.com/sergey-shambir/cpp-promise-demo.git
git submodule update --init
cmake -G "Visual Studio 2017" .
cmake --build .
libpromise
— реализует Promise (подобный Promise/A+) и базовую платформу (event loop, thread pool)promise-app
— демонстрирует, как можно применять самописные Promiseboost-future-pain
— демонстрирует, как не надо использовать boost.future- изменяйте значение макроса OPTION_PAIN_LEVEL для изменения уровня подводных камней Boost
libhttp
— поверх CURL реализует AsyncHttpClient, выполняющий обработку множества сетевых запросов в одном выделенном потокеhttpbin-app
— демонстрирует лёгкость обработки сетевых запросов через Promise
Структура классов:
- класс
PromiseObject<Value>
предоставляет реализацию так называемого shared state, хранящего текущее состояние и его данные, а также прикреплённые колбеки - класс
Promise<Value>
предоставляет похожий на shared_ptr фасад над PromiseObject, предназначенный для использования снаружи
Порт неполный, и содержит сознательно допущенные отклонения от стандарта:
- Then/Catch могут быть вызваны лишь по одному разу для каждого Promise, и не выполняют продолжение (continuation) задачи
- Для выполнения продолжения в Promise реализован отдельный метод ThenDo, который имеет несколько перегрузок, от простых до максимально гибких
- Отсутствуют аналоги функций all и race, хотя принципально ничто не мешает их написать, за исключением необходимости выбора между двумя вариантами реализации all:
- с фиксированным числом разнородных значений внутри
tuple<T1, T2, T3>
- с произвольным числом однородных значений внутри
vector<T>
- с фиксированным числом разнородных значений внутри
Класс предоставляет API для запросов к сети:
- API асинхронный и использует
Promise<HttpResponse>
вместо блокирования/возвратаHttpResponse
- Один Network поток одновременно выполняет много запросов, используя интерфейс multi библиотеки libcurl