DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
FrameConcepts.hpp
Go to the documentation of this file.
1
23
24#ifndef FDDETDATAFORMATS_INCLUDE_FDDETDATAFORMATS_FRAMECONCEPTS_HPP_
25#define FDDETDATAFORMATS_INCLUDE_FDDETDATAFORMATS_FRAMECONCEPTS_HPP_
26
29
30#include <concepts>
31#include <cstdint>
32
34
35template<typename T>
36concept HasGetADC = std::is_member_function_pointer_v<decltype(&T::get_adc)>;
37
38template<typename T>
39concept HasSetADC = std::is_member_function_pointer_v<decltype(&T::set_adc)>;
40
41template<typename T>
42concept HasDAQHeader = requires(const T t) { t.daq_header; } &&
43 (std::same_as<decltype(std::declval<T>().daq_header), dunedaq::detdataformats::DAQEthHeader> ||
44 std::same_as<decltype(std::declval<T>().daq_header), dunedaq::detdataformats::DAQHeader>);
45
46template<typename T>
47concept HasFrameHeader = requires(const T t) { t.header; }; // NOLINT(readability/braces)
48
49// Instead of std::totally_ordered, this just literally only requires the "<" operator
50template<typename T>
51concept HasLessThan = requires(const T a, const T b) {
52 { a < b } -> std::convertible_to<bool>;
53}; // NOLINT(readability/braces)
54
55template<typename T>
56concept HasNoCompilerPadding = requires {
57 // "convertible_to" is used rather than "same_as" because s_expected_bytes is typically constexpr
58 { T::s_expected_bytes } -> std::convertible_to<std::size_t>;
59} && (T::s_expected_bytes == sizeof(T));
60
61template<typename T>
62concept HasGetTimestamp = requires(const T ct) {
63 { ct.get_timestamp() } -> std::same_as<uint64_t>; // NOLINT(build/unsigned)
64}; // NOLINT(readability/braces)
65
66template<typename T>
67concept HasSetTimestamp = requires(T t, uint64_t ts) // NOLINT(build/unsigned)
68{
69 { t.set_timestamp(ts) } -> std::same_as<void>;
70}; // NOLINT(readability/braces)
71
72// TODO: John Freeman (jcfree@fnal.gov), Jun-17-2026
73
74// In the next two months, figure out a concept parallel to
75// AdaptableFrameConcept which can be made specific to the type
76// adapters in fdreadoutlibs (as opposed to, e.g.,
77// TriggerPrimitiveTypeAdapter.hpp in trigger). This can include
78// concepts commented out below like "has an ADC getter", etc.)
79
80template<typename T>
83 // HasGetADC<T> &&
84 // HasSetADC<T> &&
85 // HasDAQHeader<T> &&
86 // HasFrameHeader<T> &&
87 HasGetTimestamp<T> && HasSetTimestamp<T> && std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>;
88
89} // namespace dunedaq::fddetdataformats
90
91#endif // FDDETDATAFORMATS_INCLUDE_FDDETDATAFORMATS_FRAMECONCEPTS_HPP_
DAQEthHeader is a versioned and unified structure for every FE electronics.
DAQHeader is a versioned and unified structure for every FE electronics.
Definition DAQHeader.hpp:23