libtcspc C++ API
Streaming TCSPC and time tag data processing
Loading...
Searching...
No Matches
variant_event.hpp
1/*
2 * This file is part of libtcspc
3 * Copyright 2019-2026 Board of Regents of the University of Wisconsin System
4 * SPDX-License-Identifier: MIT
5 */
6
7#pragma once
8
9#include "common.hpp"
10#include "event.hpp"
11#include "type_list.hpp"
12
13#include <ostream>
14#include <type_traits>
15#include <utility>
16#include <variant>
17
18namespace tcspc {
19
40
61template <typename EventList> class variant_event;
62
64
65template <typename... Events>
66class variant_event<type_list<Events...>> : public std::variant<Events...> {
67 static_assert(sizeof...(Events) > 0,
68 "variant_event cannot have empty EventList");
69
70 using base_type = std::variant<Events...>;
71 using base_type::base_type;
72
73 friend auto operator<<(std::ostream &stream, variant_event const &event)
74 -> std::ostream &
75 requires(internal::ostreamable<Events> && ...)
76 {
77 return std::visit(
78 [&](auto const &e) -> std::ostream & { return stream << e; },
79 event);
80 }
81};
82
84
85namespace internal {
86
87template <typename EventList>
88struct variant_or_single_event_impl
89 : std::type_identity<variant_event<EventList>> {};
90
91template <typename Event>
92struct variant_or_single_event_impl<type_list<Event>>
93 : std::type_identity<Event> {};
94
95} // namespace internal
96
107template <typename EventList>
108using variant_or_single_event = internal::variant_or_single_event_impl<
110
124
130template <typename Visitor, typename Event>
131constexpr auto visit_variant_or_single_event(Visitor visitor, Event &&event) {
132 return visitor(std::forward<Event>(event));
133}
134
140template <typename Visitor, typename EventList>
141constexpr auto
143 variant_event<EventList> &&event) {
144 return std::visit(std::forward<Visitor>(visitor), std::move(event));
145}
146
152template <typename Visitor, typename EventList>
153constexpr auto
155 variant_event<EventList> const &event) {
156 return std::visit(std::forward<Visitor>(visitor), event);
157}
158
164template <typename Visitor, typename EventList>
165constexpr auto visit_variant_or_single_event(Visitor &&visitor,
167 return std::visit(std::forward<Visitor>(visitor), event);
168}
169
171
173
174} // namespace tcspc
Variant event.
Definition variant_event.hpp:61
internal::variant_or_single_event_impl< unique_type_list_t< EventList > >::type variant_or_single_event
Select the plain event if single, otherwise tcspc::variant_event.
Definition variant_event.hpp:108
unique_type_list< TypeList >::type unique_type_list_t
Helper type for tcspc::unique_type_list.
Definition type_list.hpp:335
constexpr auto visit_variant_or_single_event(Visitor visitor, Event &&event)
Apply a visitor to an event that is not a tcspc::variant_event.
Definition variant_event.hpp:131
libtcspc namespace.
Definition acquire.hpp:30
Compile-time representation of a list of types.
Definition type_list.hpp:38