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 "type_list.hpp"
11
12#include <ostream>
13#include <type_traits>
14#include <utility>
15#include <variant>
16
17namespace tcspc {
18
39
58template <typename EventList> class variant_event;
59
61
62template <typename... Events>
63class variant_event<type_list<Events...>> : public std::variant<Events...> {
64 static_assert(sizeof...(Events) > 0,
65 "variant_event cannot have empty EventList");
66
67 using base_type = std::variant<Events...>;
68 using base_type::base_type;
69
70 friend auto operator<<(std::ostream &stream, variant_event const &event)
71 -> std::ostream & {
72 return std::visit(
73 [&](auto const &e) -> std::ostream & { return stream << e; },
74 event);
75 }
76};
77
79
80namespace internal {
81
82template <typename EventList>
83struct variant_or_single_event_impl
84 : std::type_identity<variant_event<EventList>> {};
85
86template <typename Event>
87struct variant_or_single_event_impl<type_list<Event>>
88 : std::type_identity<Event> {};
89
90} // namespace internal
91
102template <typename EventList>
104 typename internal::variant_or_single_event_impl<
106
120
126template <typename Visitor, typename Event>
127constexpr auto visit_variant_or_single_event(Visitor visitor, Event &&event) {
128 return visitor(std::forward<Event>(event));
129}
130
136template <typename Visitor, typename EventList>
137constexpr auto
139 variant_event<EventList> &&event) {
140 return std::visit(std::forward<Visitor>(visitor), std::move(event));
141}
142
148template <typename Visitor, typename EventList>
149constexpr auto
151 variant_event<EventList> const &event) {
152 return std::visit(std::forward<Visitor>(visitor), event);
153}
154
160template <typename Visitor, typename EventList>
161constexpr auto visit_variant_or_single_event(Visitor &&visitor,
163 return std::visit(std::forward<Visitor>(visitor), event);
164}
165
167
169
170} // namespace tcspc
Variant event.
Definition variant_event.hpp:58
typename 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:103
typename unique_type_list< TypeList >::type unique_type_list_t
Helper type for tcspc::unique_type_list.
Definition type_list.hpp:299
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:127
libtcspc namespace.
Definition acquire.hpp:29
Compile-time representation of a list of types.
Definition type_list.hpp:38