#include "../Renderive/architecture/Update_Completion.h" #include "asio.hpp" #include #include int main() { asio::io_context io; auto state = renderive::make_update_state(); renderive::Update_Ticket ticket(state); std::atomic_int rendered_count{}; std::atomic_int input_count{}; ticket.async_wait(renderive::Update_Stage::Rendered, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (error || outcome != renderive::Update_Outcome::Completed) std::terminate(); rendered_count.fetch_add(1, std::memory_order_relaxed); })); state->complete_until(renderive::Update_Stage::Input_Released); io.poll(); if (rendered_count.load(std::memory_order_relaxed) != 0) return 1; state->complete_until(renderive::Update_Stage::Rendered); io.restart(); io.run(); if (rendered_count.load(std::memory_order_relaxed) != 1) return 2; ticket.async_wait(renderive::Update_Stage::Input_Released, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (error || outcome != renderive::Update_Outcome::Completed) std::terminate(); input_count.fetch_add(1, std::memory_order_relaxed); })); io.restart(); io.run(); if (input_count.load(std::memory_order_relaxed) != 1) return 3; auto cancelled_state = renderive::make_update_state(); renderive::Update_Ticket cancelled_ticket(cancelled_state); std::atomic_int cancel_count{}; cancelled_ticket.async_wait(renderive::Update_Stage::Presented, asio::bind_executor(io.get_executor(), [&](std::error_code error, renderive::Update_Outcome outcome) { if (!error || outcome != renderive::Update_Outcome::Cancelled) std::terminate(); cancel_count.fetch_add(1, std::memory_order_relaxed); })); cancelled_state->complete_all(std::make_error_code(std::errc::operation_canceled), renderive::Update_Outcome::Cancelled); io.restart(); io.run(); return cancel_count.load(std::memory_order_relaxed) == 1 ? 0 : 4; }