ThreadSchedule 1.0.0
Modern C++ thread management library
Loading...
Searching...
No Matches
concepts.hpp
1#pragma once
2
3#include <chrono>
4#include <functional>
5#include <set>
6#include <thread>
7#include <type_traits>
8#include <vector>
9
10namespace threadschedule
11{
12
13// Custom duration trait for compatibility across all C++ versions
14template <typename T, typename = void>
15struct is_duration_impl : std::false_type
16{
17};
18
19template <typename T>
20struct is_duration_impl<T, std::void_t<typename T::rep, typename T::period>> : std::true_type
21{
22};
23
24// C++23 concepts (with fallbacks for older compilers)
25#if __cpp_concepts >= 201907L
26
30template <typename F, typename... Args>
31concept ThreadCallable = std::is_invocable_v<F, Args...>;
32
36template <typename T>
37concept ThreadIdentifiable = requires(T t) {
38 { t.get_id() } -> std::convertible_to<std::thread::id>;
39};
40
44template <typename T>
45concept Duration = requires {
46 typename T::rep;
47 typename T::period;
48};
49
53template <typename T>
54concept PriorityType = std::is_integral_v<T>;
55
59template <typename T>
60concept CPUSetType = requires(T t) {
61 { t.size() } -> std::convertible_to<std::size_t>;
62 { t.begin() };
63 { t.end() };
64};
65
66#else
67
68// Fallback using SFINAE for older compilers
69template <typename F, typename... Args>
70constexpr bool ThreadCallable = std::is_invocable_v<F, Args...>;
71
72template <typename T>
73constexpr bool ThreadIdentifiable = std::is_same_v<decltype(std::declval<T>().get_id()), std::thread::id>;
74
75template <typename T>
76constexpr bool Duration = is_duration_impl<T>::value;
77
78template <typename T>
79constexpr bool PriorityType = std::is_integral_v<T>;
80
81// For CPU set types, we'll use a simple trait
82template <typename T>
83constexpr bool CPUSetType = std::is_same_v<T, std::vector<int>> || std::is_same_v<T, std::set<int>>;
84
85#endif
86
90template <typename T>
91struct is_thread_like : std::false_type
92{
93};
94
95template <>
96struct is_thread_like<std::thread> : std::true_type
97{
98};
99
100// Only include jthread if C++20 is available
101#if __cplusplus >= 202002L
102template <>
103struct is_thread_like<std::jthread> : std::true_type
104{
105};
106#endif
107
108template <typename T>
109inline constexpr bool is_thread_like_v = is_thread_like<T>::value;
110
114template <typename T>
115using enable_if_thread_callable_t = std::enable_if_t<std::is_invocable_v<T>, int>;
116
117template <typename T>
118using enable_if_duration_t = std::enable_if_t<is_duration_impl<T>::value, int>;
119
120} // namespace threadschedule
Type trait for thread-like objects.
Definition concepts.hpp:92