diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 64667f6..ab7bfbe 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(asio-banking) +add_subdirectory(example-asio) diff --git a/examples/asio-banking/CMakeLists.txt b/examples/asio-banking/CMakeLists.txt deleted file mode 100644 index 01efb17..0000000 --- a/examples/asio-banking/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -add_executable(example-asio-banking - ${CMAKE_CURRENT_LIST_DIR}/example-asio-banking.cpp) - -target_include_directories(example-asio-banking - PRIVATE - ${CMAKE_CURRENT_LIST_DIR}) - -target_link_libraries(example-asio-banking - PRIVATE - asio - continuable) diff --git a/examples/example-asio/CMakeLists.txt b/examples/example-asio/CMakeLists.txt new file mode 100644 index 0000000..e9cebd5 --- /dev/null +++ b/examples/example-asio/CMakeLists.txt @@ -0,0 +1,15 @@ +add_executable(example-asio + ${CMAKE_CURRENT_LIST_DIR}/example-asio.cpp) + +target_include_directories(example-asio + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}) + +target_link_libraries(example-asio + PRIVATE + asio + continuable) + +target_compile_definitions(example-asio + PUBLIC + -DCONTINUABLE_WITH_NO_EXCEPTIONS) diff --git a/examples/asio-banking/example-asio-banking.cpp b/examples/example-asio/example-asio.cpp similarity index 53% rename from examples/asio-banking/example-asio-banking.cpp rename to examples/example-asio/example-asio.cpp index f9a8a0d..5f3cb37 100644 --- a/examples/asio-banking/example-asio-banking.cpp +++ b/examples/example-asio/example-asio.cpp @@ -28,7 +28,11 @@ SOFTWARE. **/ +#include #include +#include +#include +#include #include @@ -37,35 +41,68 @@ using namespace std::chrono_literals; struct functional_io_service : asio::io_service { + asio::ip::udp::resolver resolver_; + + functional_io_service() : resolver_(*this) { + } + auto post() const noexcept { return [this](auto&& work) { asio::io_service::post(std::forward(work)); }; } + + auto wait_async(std::chrono::milliseconds time) { + return cti::make_continuable([](auto&& promise) { + // ... + promise.set_value(); + }); + } + + template + auto async_resolve(Protocol&& protocol, std::string host, + std::string service) { + using asio::ip::udp; + + return cti::make_continuable([ + this, protocol = std::forward(protocol), host = std::move(host), + service = std::move(service) + ](auto&& promise) mutable { + resolver_.async_resolve( + host, service, + [promise = std::forward(promise)]( + std::error_code const& error, + udp::resolver::iterator iterator) mutable { + + if (error) { + promise.set_exception( + std::error_condition(error.value(), error.category())); + } else { + promise.set_value(std::move(iterator)); + } + }); + }); + } }; -static functional_io_service service; - -auto wait_async(std::chrono::milliseconds time) { - return cti::make_continuable([](auto&& promise) { - // ... - promise.set_value(); - }); -} - int main(int, char**) { - wait_async(10s) - .then([] { - // ... + using asio::ip::udp; - return wait_async(2s); + functional_io_service service; + + service.async_resolve(udp::v4(), "127.0.0.1", "daytime") + .then([](udp::resolver::iterator iterator) { + // ... + return *iterator; }) - .then([] { + .then([](udp::endpoint endpoint) { + // auto socket = std::make_shared(service); + // socket->async_send_to() + }) + .fail([](cti::error_type error) { // ... }); - asio::tim - service.run(); return 0; }