rad  3.0.0
stopToken.hpp
Go to the documentation of this file.
1 
8 #ifndef RAD_STOP_TOKEN_HPP
9 #define RAD_STOP_TOKEN_HPP
10 
11 #include <atomic>
12 #include <memory>
13 
14 namespace rad {
15 
16 namespace detail {
17 
23 struct StopState {
24  StopState() noexcept = default;
25 
26  void IncSources() noexcept;
27  void DecSources() noexcept;
28 
29  void IncTokens() noexcept;
30  void DecTokens() noexcept;
31 
32  unsigned GetNumSources() const noexcept;
33  unsigned GetNumTokens() const noexcept;
34 
35  [[nodiscard]] bool StopRequested() const noexcept;
41  bool RequestStop() noexcept;
42 
43  private:
45  std::atomic<unsigned> m_num_sources;
47  std::atomic<unsigned> m_num_tokens;
48 
49  std::atomic<bool> m_stop_requested;
50 };
51 
52 } // namespace detail
53 
54 class StopSource;
55 
62 class StopToken {
63  public:
69  StopToken() noexcept = default;
70  StopToken(StopToken const&) noexcept;
71  StopToken(StopToken&&) noexcept = default;
72  StopToken& operator=(StopToken const&);
73  ~StopToken();
74 
78  void Swap(StopToken& other) noexcept;
79 
84  [[nodiscard]] bool StopRequested() const noexcept;
85 
90  [[nodiscard]] bool StopPossible() const noexcept;
91 
95  bool operator==(StopToken const& rhs) const noexcept;
96  bool operator!=(StopToken const& rhs) const noexcept;
97 
98  private:
99  friend class StopSource;
100 
104  explicit StopToken(std::shared_ptr<detail::StopState> state) noexcept;
105 
106  std::shared_ptr<::rad::detail::StopState> m_state;
107 };
108 
112 class StopSource {
113  public:
114  StopSource() noexcept;
115  StopSource(StopSource const&) noexcept;
116  StopSource& operator=(StopSource const&);
117  StopSource(StopSource&&) noexcept = default;
118  ~StopSource();
119 
124  bool operator==(StopSource const& rhs) const noexcept;
125  bool operator!=(StopSource const& rhs) const noexcept;
126 
130  [[nodiscard]] bool StopRequested() const noexcept;
131 
136  [[nodiscard]] bool StopPossible() const noexcept;
137 
141  [[nodiscard]] StopToken GetToken() const noexcept;
142 
146  void Swap(StopSource& other) noexcept;
147 
154  bool RequestStop() noexcept;
155 
156  private:
157  std::shared_ptr<::rad::detail::StopState> m_state;
158 };
159 
160 } // namespace rad
161 
162 #endif // #define RAD_STOP_TOKEN_HPP
rad::detail::StopState
Definition: stopToken.hpp:23
rad::StopToken
Definition: stopToken.hpp:62
rad::detail::StopState::GetNumSources
unsigned GetNumSources() const noexcept
Definition: stopToken.cpp:25
rad::detail::StopState::IncTokens
void IncTokens() noexcept
Definition: stopToken.cpp:17
rad::StopSource
Definition: stopToken.hpp:112
rad::detail::StopState::RequestStop
bool RequestStop() noexcept
Definition: stopToken.cpp:37
rad::StopSource::StopSource
StopSource(StopSource &&) noexcept=default
rad::detail::StopState::StopState
StopState() noexcept=default
rad
Definition: actionCallback.hpp:21
rad::StopToken::StopToken
StopToken() noexcept=default
rad::detail::StopState::IncSources
void IncSources() noexcept
Definition: stopToken.cpp:9
rad::detail::StopState::DecSources
void DecSources() noexcept
Definition: stopToken.cpp:13
std
Definition: errors.hpp:58
rad::detail::StopState::DecTokens
void DecTokens() noexcept
Definition: stopToken.cpp:21
rad::detail::StopState::StopRequested
bool StopRequested() const noexcept
Definition: stopToken.cpp:33
rad::detail::StopState::GetNumTokens
unsigned GetNumTokens() const noexcept
Definition: stopToken.cpp:29