Thread System 0.3.1
High-performance C++20 thread pool with work stealing and DAG scheduling
Loading...
Searching...
No Matches
queue_traits.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
11#pragma once
12
13#include <type_traits>
14
15namespace kcenon::thread {
16
17// Forward declarations
18class scheduler_interface;
19class queue_capabilities_interface;
20
21template<typename SyncPolicy, typename BoundPolicy, typename OverflowPolicy>
22class policy_queue;
23
24namespace policies {
25 struct sync_policy_tag;
26 struct bound_policy_tag;
27 struct overflow_policy_tag;
28}
29
30// ============================================
31// Policy detection traits
32// ============================================
33
34namespace detail {
35
39template<typename T, typename = void>
40struct has_sync_policy_tag : std::false_type {};
41
42template<typename T>
43struct has_sync_policy_tag<T, std::void_t<typename T::policy_tag>>
44 : std::is_same<typename T::policy_tag, policies::sync_policy_tag> {};
45
49template<typename T, typename = void>
50struct has_bound_policy_tag : std::false_type {};
51
52template<typename T>
53struct has_bound_policy_tag<T, std::void_t<typename T::policy_tag>>
54 : std::is_same<typename T::policy_tag, policies::bound_policy_tag> {};
55
59template<typename T, typename = void>
60struct has_overflow_policy_tag : std::false_type {};
61
62template<typename T>
63struct has_overflow_policy_tag<T, std::void_t<typename T::policy_tag>>
64 : std::is_same<typename T::policy_tag, policies::overflow_policy_tag> {};
65
66} // namespace detail
67
68// ============================================
69// Policy type concepts (SFINAE-style)
70// ============================================
71
75template<typename T>
77
81template<typename T>
83
87template<typename T>
89
90// ============================================
91// Queue type detection traits
92// ============================================
93
94namespace detail {
95
99template<typename T>
100struct is_policy_queue_impl : std::false_type {};
101
105template<typename SyncPolicy, typename BoundPolicy, typename OverflowPolicy>
106struct is_policy_queue_impl<policy_queue<SyncPolicy, BoundPolicy, OverflowPolicy>>
107 : std::true_type {};
108
112template<typename T, typename = void>
113struct has_sync_policy_type : std::false_type {};
114
115template<typename T>
116struct has_sync_policy_type<T, std::void_t<typename T::sync_policy_type>>
117 : std::true_type {};
118
122template<typename T, typename = void>
123struct has_bound_policy_type : std::false_type {};
124
125template<typename T>
126struct has_bound_policy_type<T, std::void_t<typename T::bound_policy_type>>
127 : std::true_type {};
128
132template<typename T, typename = void>
133struct has_overflow_policy_type : std::false_type {};
134
135template<typename T>
136struct has_overflow_policy_type<T, std::void_t<typename T::overflow_policy_type>>
137 : std::true_type {};
138
139} // namespace detail
140
158template<typename T>
160
166template<typename T>
167constexpr bool is_scheduler_v = std::is_base_of_v<scheduler_interface, std::remove_cv_t<T>>;
168
172template<typename T>
174 std::is_base_of_v<queue_capabilities_interface, std::remove_cv_t<T>>;
175
176// ============================================
177// Policy extraction traits
178// ============================================
179
194template<typename T, typename = void>
196 static constexpr bool is_policy_queue = false;
197};
198
199template<typename T>
200struct policy_queue_traits<T, std::enable_if_t<
201 detail::has_sync_policy_type<T>::value &&
202 detail::has_bound_policy_type<T>::value &&
203 detail::has_overflow_policy_type<T>::value>>
204{
205 static constexpr bool is_policy_queue = true;
206
207 using sync_policy_type = typename T::sync_policy_type;
208 using bound_policy_type = typename T::bound_policy_type;
209 using overflow_policy_type = typename T::overflow_policy_type;
210};
211
212// ============================================
213// Queue capability detection
214// ============================================
215
221template<typename T, typename = void>
222struct is_lockfree_queue : std::false_type {};
223
224template<typename T>
225struct is_lockfree_queue<T, std::enable_if_t<policy_queue_traits<T>::is_policy_queue>>
226{
227 static constexpr bool value =
229};
230
231template<typename T>
233
239template<typename T, typename = void>
240struct is_bounded_queue : std::false_type {};
241
242template<typename T>
243struct is_bounded_queue<T, std::enable_if_t<policy_queue_traits<T>::is_policy_queue>>
244{
245 static constexpr bool value =
247};
248
249template<typename T>
251
255template<typename T, typename = void>
256struct has_blocking_overflow : std::false_type {};
257
258template<typename T>
259struct has_blocking_overflow<T, std::enable_if_t<policy_queue_traits<T>::is_policy_queue>>
260{
261 static constexpr bool value =
263};
264
265template<typename T>
267
268} // namespace kcenon::thread
Policy-based queue template.
Core threading foundation of the thread system library.
Definition thread_impl.h:17
constexpr bool is_policy_queue_v
Check if type is a policy_queue instantiation.
constexpr bool is_lockfree_queue_v
constexpr bool is_overflow_policy_v
Check if type is an overflow policy.
constexpr bool is_bounded_queue_v
constexpr bool is_bound_policy_v
Check if type is a bound policy.
constexpr bool is_scheduler_v
Check if type is a scheduler_interface.
constexpr bool is_queue_capabilities_v
Check if type is a queue_capabilities_interface.
constexpr bool is_sync_policy_v
Check if type is a sync policy.
constexpr bool has_blocking_overflow_v
STL namespace.
Detect if type has bound_policy_tag.
Detect if type has bound_policy_type member.
Detect if type has overflow_policy_tag.
Detect if type has overflow_policy_type member.
Detect if type has sync_policy_tag.
Detect if type has sync_policy_type member.
Primary template: not a policy_queue.
Compile-time detection of blocking overflow policy.
Compile-time detection of bounded queue.
Compile-time detection of lock-free capability.
Extract policy types from a policy_queue.
static constexpr bool is_policy_queue