tin  1.5.9
concepts.h
Go to the documentation of this file.
1 // Copyright (c) 2026 Tinverse LLC. All rights reserved.
2 // SPDX-License-Identifier: LicenseRef-Tinverse-Commercial
3 
12 
13 #pragma once
14 
15 #include <concepts>
16 #include <cstddef>
17 #include <cstdint>
18 #include <utility>
19 
20 #include "tsm/ticks.h"
21 
22 namespace tsm {
23 
32 namespace dispatch_model {
33 
34 struct direct;
35 struct queued;
36 struct per_region_queued;
37 
38 } // namespace dispatch_model
39 
40 namespace overflow {
41 
42 struct reject_newest;
43 struct drop_oldest;
44 struct overwrite_latest;
45 
46 } // namespace overflow
47 
48 template<typename Storage, typename Overflow = overflow::reject_newest>
49 struct queue_policy;
50 
51 template<typename DispatchModel,
52  typename QueueOrStorage,
53  typename Scheduler = void,
54  typename Overflow = overflow::reject_newest,
55  typename Transport = void>
56 struct runtime_policy;
57 
58 template<typename DispatchModel>
60  std::same_as<DispatchModel, dispatch_model::direct> ||
61  std::same_as<DispatchModel, dispatch_model::queued> ||
62  std::same_as<DispatchModel, dispatch_model::per_region_queued>;
63 
64 template<typename Overflow>
65 concept overflow_policy = std::same_as<Overflow, overflow::reject_newest> ||
66  std::same_as<Overflow, overflow::drop_oldest> ||
67  std::same_as<Overflow, overflow::overwrite_latest>;
68 
70 {
72  std::uint32_t sequence{};
73 };
74 
75 namespace runtime {
76 
77 namespace topology {
78 
82 
83 } // namespace topology
84 
85 namespace overflow {
86 
90 
91 } // namespace overflow
92 
93 namespace scheduler {
94 
95 struct caller_driven;
96 struct task_driven;
97 struct external_executor;
98 
99 } // namespace scheduler
100 
101 using ::tsm::dispatch_context;
102 
113 template<typename Queue, typename Event>
114 concept queue_storage = requires(Queue queue, Event event, Event out)
115 {
116  typename Queue::value_type;
117  requires std::same_as<typename Queue::value_type, Event>;
118  {
119  queue.try_push(event)
120  } -> std::convertible_to<bool>;
121  {
122  queue.try_push(std::move(event))
123  } -> std::convertible_to<bool>;
124  {
125  queue.try_pop(out)
126  } -> std::convertible_to<bool>;
127  {
128  queue.empty()
129  } -> std::convertible_to<bool>;
130  {
131  queue.full()
132  } -> std::convertible_to<bool>;
133  {
134  queue.size()
135  } -> std::convertible_to<std::size_t>;
136 };
137 
138 template<typename Storage, typename Event>
140 {
141  typename Storage::template queue<Event>;
142 }
143 &&queue_storage<typename Storage::template queue<Event>, Event>;
144 
145 template<typename Policy>
147 {
148  typename Policy::storage;
149  typename Policy::overflow;
150 }
151 &&::tsm::overflow_policy<typename Policy::overflow>;
152 
153 template<typename Sink, typename Event>
154 concept event_sink = requires(Sink sink, Event event)
155 {
156  {
157  sink.send_event(event)
158  } -> std::convertible_to<bool>;
159 };
160 
161 template<typename Source, typename Event>
162 concept event_source = requires(Source source, Event& event)
163 {
164  {
165  source.try_receive(event)
166  } -> std::convertible_to<bool>;
167 };
168 
169 template<typename Runtime>
171 {
172  {
173  runtime.step()
174  } -> std::convertible_to<bool>;
175  {
176  runtime.drain()
177  } -> std::convertible_to<std::size_t>;
178  {
179  runtime.empty()
180  } -> std::convertible_to<bool>;
181  {
182  runtime.pending_events()
183  } -> std::convertible_to<std::size_t>;
184  {
185  runtime.last_event_handled()
186  } -> std::convertible_to<bool>;
187 };
188 
196 template<typename Executor>
197 concept executor_backend = requires(Executor executor)
198 {
199  {
200  executor.step()
201  } -> std::convertible_to<bool>;
202  {
203  executor.run_ready()
204  } -> std::convertible_to<std::size_t>;
205 };
206 
214 template<typename Executor>
215 concept wake_executor_backend = executor_backend<Executor> &&
216  requires(Executor executor)
217 {
218  executor.wake();
219  executor.wake_from_isr();
220  executor.wait_for_work();
221 };
222 
223 template<typename Policy>
225 {
226  typename Policy::dispatch_model;
227  typename Policy::queue;
228 }
229 &&::tsm::dispatch_model_policy<typename Policy::dispatch_model>&&
230  runtime_queue_policy<typename Policy::queue>;
231 
232 } // namespace tsm::runtime
233 
234 } // namespace tsm
Definition: static_ring.h:190
bool try_pop(T &value)
Definition: static_ring.h:213
std::size_t size() const
Definition: static_ring.h:226
bool full() const
Definition: static_ring.h:222
bool empty() const
Definition: static_ring.h:218
bool try_push(T const &value)
Definition: static_ring.h:203
requires(!has_transition_type_c< T > &&has_transition_member_c< T >) struct transitions_of< T >
Definition: transition.h:479
Definition: concepts.h:40
::tsm::overflow::reject_newest reject_newest
Definition: concepts.h:87
::tsm::overflow::drop_oldest drop_oldest
Definition: concepts.h:88
::tsm::overflow::overwrite_latest overwrite_latest
Definition: concepts.h:89
concept caller_driven_runtime
Definition: concepts.h:170
detail::runtime_impl< Definition, Policy, MachinePolicy > Runtime
Definition: runtime.h:531
concept queue_storage_policy
Definition: concepts.h:139
concept event_sink
Definition: concepts.h:154
concept event_source
Definition: concepts.h:162
concept queue_storage
Definition: concepts.h:114
concept runtime_queue_policy
Definition: concepts.h:146
concept wake_executor_backend
Definition: concepts.h:215
concept executor_backend
Definition: concepts.h:197
Definition: bare_metal.h:20
concept dispatch_model_policy
Definition: concepts.h:59
std::chrono::duration< tick_rep, tick_period > tick_duration
Chrono duration type used for semantic scheduler ticks.
Definition: ticks.h:50
concept overflow_policy
Definition: concepts.h:65
Definition: concepts.h:70
tsm::tick_duration tick
Definition: concepts.h:71
std::uint32_t sequence
Definition: concepts.h:72
Definition: policy.h:27
Definition: policy.h:29
Definition: policy.h:40
Definition: policy.h:42
Definition: policy.h:38
Definition: policy.h:52
Definition: policy.h:89
Target-neutral tick value type.