51concept Resultable =
requires(
const T t) {
52 { t.is_ok() } -> std::convertible_to<bool>;
53 { t.is_err() } -> std::convertible_to<bool>;
61concept Unwrappable =
requires(T t) {
62 typename T::value_type;
63 { t.unwrap() } -> std::same_as<
typename std::add_lvalue_reference<
64 typename std::add_const<typename T::value_type>::type>::type>;
65 { t.unwrap_or(std::declval<typename T::value_type>()) }
66 -> std::convertible_to<typename T::value_type>;
74concept Mappable =
requires(
const T t) {
75 { t.map(std::declval<std::function<
int(
typename T::value_type)>>()) };
83concept Chainable =
requires(
const T t) {
84 { t.and_then(std::declval<std::function<T(
typename T::value_type)>>()) };
92concept MonadicResult = Resultable<T> && Mappable<T> && Chainable<T>;
99concept OptionalLike =
requires(
const T t) {
100 { t.has_value() } -> std::convertible_to<bool>;
101 { t.is_some() } -> std::convertible_to<bool>;
102 { t.is_none() } -> std::convertible_to<bool>;
110concept ErrorInfo =
requires(
const T t) {
111 { t.code } -> std::convertible_to<int>;
112 { t.message } -> std::convertible_to<std::string>;
113 { t.module } -> std::convertible_to<std::string>;
121concept ValueOrError = Resultable<T> &&
requires(
const T t) {
134template<
typename F,
typename... Args>
135concept Invocable = std::invocable<F, Args...>;
141template<
typename F,
typename... Args>
142concept VoidCallable = Invocable<F, Args...> &&
143 std::is_void_v<std::invoke_result_t<F, Args...>>;
149template<
typename F,
typename R,
typename... Args>
150concept ReturnsResult = Invocable<F, Args...> &&
151 std::convertible_to<std::invoke_result_t<F, Args...>, R>;
157template<
typename F,
typename... Args>
158concept NoexceptCallable = Invocable<F, Args...> &&
159 std::is_nothrow_invocable_v<F, Args...>;
165template<
typename F,
typename... Args>
166concept Predicate = Invocable<F, Args...> &&
167 std::convertible_to<std::invoke_result_t<F, Args...>,
bool>;
173template<
typename F,
typename Arg>
174concept UnaryFunction = Invocable<F, Arg>;
180template<
typename F,
typename Arg1,
typename Arg2>
181concept BinaryFunction = Invocable<F, Arg1, Arg2>;
188concept JobLike =
requires(T t) {
190 { t.get_name() } -> std::convertible_to<std::string>;
191 { t.get_priority() } -> std::convertible_to<int>;
199concept ExecutorLike =
requires(T t, std::unique_ptr<interfaces::IJob> job,
bool wait) {
200 { t.worker_count() } -> std::convertible_to<size_t>;
201 { t.is_running() } -> std::convertible_to<bool>;
202 { t.pending_tasks() } -> std::convertible_to<size_t>;
203 { t.shutdown(wait) } -> std::same_as<void>;
210template<
typename F,
typename T>
211concept TaskFactory = Invocable<F> &&
212 std::convertible_to<std::invoke_result_t<F>, std::unique_ptr<T>>;
218template<
typename F,
typename R>
219concept AsyncCallable = Invocable<F> &&
220 std::same_as<std::invoke_result_t<F>, R>;
227concept DelayedCallable = VoidCallable<F> &&
228 std::move_constructible<std::decay_t<F>>;
239concept EventType = std::is_class_v<T> &&
240 std::is_copy_constructible_v<T>;
246template<
typename H,
typename E>
247concept EventHandler = std::invocable<H, const E&> &&
248 std::is_void_v<std::invoke_result_t<H, const E&>>;
254template<
typename F,
typename E>
255concept EventFilter = std::invocable<F, const E&> &&
256 std::convertible_to<std::invoke_result_t<F, const E&>,
bool>;
263concept TimestampedEvent = EventType<T> &&
requires(
const T t) {
264 { t.timestamp } -> std::convertible_to<std::chrono::steady_clock::time_point>;
272concept NamedEvent = EventType<T> &&
requires(
const T t) {
273 { t.module_name } -> std::convertible_to<std::string>;
281concept ErrorEvent = EventType<T> &&
requires(
const T t) {
282 { t.error_message } -> std::convertible_to<std::string>;
283 { t.error_code } -> std::convertible_to<int>;
291concept MetricEvent = EventType<T> &&
requires(
const T t) {
292 { t.name } -> std::convertible_to<std::string>;
293 { t.value } -> std::convertible_to<double>;
294 { t.unit } -> std::convertible_to<std::string>;
302concept ModuleLifecycleEvent = NamedEvent<T> && TimestampedEvent<T>;
309concept FullErrorEvent = ErrorEvent<T> && NamedEvent<T> && TimestampedEvent<T>;
316concept FullMetricEvent = MetricEvent<T> && TimestampedEvent<T>;
323concept EventBusLike =
requires(T t, uint64_t id) {
324 { t.start() } -> std::same_as<void>;
325 { t.stop() } -> std::same_as<void>;
326 { t.is_running() } -> std::convertible_to<bool>;
327 { t.unsubscribe(
id) } -> std::same_as<void>;
339concept ServiceInterface = std::is_class_v<T> && std::has_virtual_destructor_v<T>;
345template<
typename Impl,
typename Interface>
346concept ServiceImplementation = std::derived_from<Impl, Interface> &&
347 std::is_constructible_v<Impl>;
353template<
typename F,
typename T>
354concept ServiceFactory = Invocable<F> &&
355 std::convertible_to<std::invoke_result_t<F>, std::shared_ptr<T>>;
362concept Validatable =
requires(
const T t) {
363 { t.validate() } -> std::convertible_to<bool>;
375concept Container =
requires(T t) {
376 typename T::value_type;
377 typename T::size_type;
378 { t.size() } -> std::convertible_to<typename T::size_type>;
379 { t.empty() } -> std::convertible_to<bool>;
389concept SequenceContainer = Container<T> &&
requires(T t,
typename T::value_type v) {
391 { t.front() } -> std::same_as<typename T::value_type&>;
392 { t.back() } -> std::same_as<typename T::value_type&>;
400concept ResizableContainer = Container<T> &&
requires(T t,
typename T::size_type n) {
403 { t.capacity() } -> std::convertible_to<typename T::size_type>;
415concept BasicLogger =
requires(T t,
const std::string& msg) {
424concept FlushableLogger = BasicLogger<T> &&
requires(T t) {
437concept CounterMetric =
requires(T t,
const std::string& name, int64_t val) {
438 { t.increment(name) };
439 { t.increment(name, val) };
447concept GaugeMetric =
requires(T t,
const std::string& name,
double val) {
448 { t.set_gauge(name, val) };
456concept HistogramMetric =
requires(T t,
const std::string& name,
double val) {
457 { t.observe(name, val) };
469concept Sendable =
requires(T t,
const std::string& data) {
479 { t.receive() } -> std::convertible_to<std::string>;
A type that can receive data.
A type that can send data.
A type that represents any transport client (HTTP or UDP).
C++20 concepts for compile-time type validation.