source: doc/papers/concurrency/examples/counter.cpp @ 8419b76

ADTast-experimentalpthread-emulationqualifiedEnum
Last change on this file since 8419b76 was 571bf75, checked in by tdelisle <tdelisle@…>, 6 years ago

Clean existing coroutines using std::experimental::suspend_never and fixed Format coroutines to use RAII

  • Property mode set to 100644
File size: 1.4 KB
Line 
1#include <iostream>
2#include <experimental/coroutine>
3
4struct counter_cor {
5        struct promise_type {
6                counter_cor get_return_object() {
7                        return counter_cor(std::experimental::coroutine_handle<promise_type>::from_promise(*this));
8                }
9
10                auto initial_suspend() { return std::experimental::suspend_never(); }
11                auto final_suspend()   { return std::experimental::suspend_never(); }
12
13                void return_void() {}
14
15                void unhandled_exception() {}
16        };
17
18        std::experimental::coroutine_handle<promise_type> _coroutine = nullptr;
19
20        explicit counter_cor(std::experimental::coroutine_handle<promise_type> coroutine)
21                : _coroutine(coroutine)
22        {}
23
24        ~counter_cor() {
25                if(_coroutine) { _coroutine.destroy(); }
26        }
27
28        counter_cor() = default;
29        counter_cor(counter_cor const &) = delete;
30        counter_cor& operator=(counter_cor const &) = delete;
31
32        counter_cor(counter_cor&& other) {
33                std::swap(_coroutine, other._coroutine);
34        }
35
36        counter_cor& operator=(counter_cor&& other) {
37                if(&other != this) {
38                        _coroutine = other._coroutine;
39                        other._coroutine = nullptr;
40                }
41                return *this;
42        }
43
44        void resume() { _coroutine.resume(); }
45};
46
47counter_cor counter() {
48        std::cout << "Counter: called\n";
49        for(unsigned i = 1;; i++) {
50                co_await std::experimental::suspend_always{};
51                std::cout << "Counter: Resumed " << i << " time(s)\n";
52        }
53}
54
55int main() {
56        std::cout << "Main: calling counter\n";
57        auto c = counter();
58        std::cout << "Main: resumes\n";
59        c.resume();
60        c.resume();
61        std::cout << "Main: done\n";
62}
Note: See TracBrowser for help on using the repository browser.