diff options
Diffstat (limited to '3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp')
-rw-r--r-- | 3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp b/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp new file mode 100644 index 00000000000..305d0ca5b86 --- /dev/null +++ b/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp @@ -0,0 +1,60 @@ +#include <asio/execution.hpp> +#include <asio/static_thread_pool.hpp> +#include <iostream> + +using asio::static_thread_pool; +namespace execution = asio::execution; + +// Traditional active object pattern. +// Member functions block until operation is finished. + +class bank_account +{ + int balance_ = 0; + mutable static_thread_pool pool_{1}; + +public: + void deposit(int amount) + { + execution::execute( + asio::require(pool_.executor(), + execution::blocking.always), + [this, amount] + { + balance_ += amount; + }); + } + + void withdraw(int amount) + { + execution::execute( + asio::require(pool_.executor(), + execution::blocking.always), + [this, amount] + { + if (balance_ >= amount) + balance_ -= amount; + }); + } + + int balance() const + { + int result = 0; + execution::execute( + asio::require(pool_.executor(), + execution::blocking.always), + [this, &result] + { + result = balance_; + }); + return result; + } +}; + +int main() +{ + bank_account acct; + acct.deposit(20); + acct.withdraw(10); + std::cout << "balance = " << acct.balance() << "\n"; +} |