Orion
high-rate readout
datafmt.hpp
Go to the documentation of this file.
1 
5 #pragma once
6 
7 #include <vector>
8 #include <concepts>
9 #include <cstdint>
10 
11 
12 namespace itk::pixel::datafmt {
13 
14 namespace concepts {
15 
17 template<typename T>
18 concept Hit =
19  std::constructible_from<T> and
20  std::constructible_from<T, uint16_t, uint16_t, uint16_t> and // (col, row, tot)
21  std::destructible<T> and
22  requires(T a, T b) {
23  a == b;
24  } and
25  requires(T self) {
26  { self.clear() } -> std::same_as<void>;
27  { self.get_col() } -> std::same_as<uint16_t>;
28  { self.get_row() } -> std::same_as<uint16_t>;
29  { self.get_tot() } -> std::same_as<uint16_t>;
30  } and
31  requires(T self, uint16_t col, uint16_t row, uint16_t tot) {
32  { self.set_col(col) } -> std::same_as<void>;
33  { self.set_row(row) } -> std::same_as<void>;
34  { self.set_tot(row) } -> std::same_as<void>;
35  };
36 
37 
39 template<typename T>
40 concept QCoreHit =
41  std::constructible_from<T> and
42  std::constructible_from<T, uint16_t, uint16_t, uint64_t> and // (qcol, qrow, qtot)
43  std::destructible<T> and
44  requires(T a, T b) {
45  a == b;
46  } and
47  requires(T self) {
48  { self.clear() } -> std::same_as<void>;
49  { self.get_qcol() } -> std::same_as<uint16_t>;
50  { self.get_qrow() } -> std::same_as<uint16_t>;
51  { self.get_qtot() } -> std::same_as<uint64_t>;
52  } and
53  requires(T self, uint16_t qcol, uint16_t qrow, uint64_t qtot) {
54  { self.set_qcol(qcol) } -> std::same_as<void>;
55  { self.set_qrow(qrow) } -> std::same_as<void>;
56  { self.set_qtot(qrow) } -> std::same_as<void>;
57  };
58 
59 
60 
62 template<typename T, typename HitMap>
63 concept HitVec =
64  std::constructible_from<T> and
65  std::constructible_from<T, const HitMap&> and
66  std::destructible<T> and
67  requires(T self) {
68  typename T::hit_t;
69  { self.hits } -> std::same_as<std::vector<typename T::hit_t>&>;
70  { self.clear() } -> std::same_as<void>;
71  { self.get_status() } -> std::same_as<uint32_t>;
72  } and
73  requires(T self, const typename T::hit_t& hit) {
74  { self.add_hit(hit) } -> std::same_as<void>;
75  } and
76  requires(T self, uint16_t col, uint16_t row, uint16_t tot) {
77  { self.add_hit(col, row, tot) } -> std::same_as<void>;
78  } and
79  requires(T self, uint16_t qcol, uint16_t qrow, uint64_t qtot) {
80  { self.add_qcore(qcol, qrow, qtot) } -> std::same_as<void>;
81  };
82 
83 
84 
85 template<typename T, typename PixVec, typename QCoreVec>
86 concept HitMap =
87  std::constructible_from<T> and
88  std::constructible_from<T, const PixVec&> and
89  std::constructible_from<T, const QCoreVec&> and
90  std::destructible<T> and
91  requires(T self, uint16_t col, uint16_t row, uint16_t tot) {
92  { self.clear() } -> std::same_as<void>;
93  { self.get_status() } -> std::same_as<uint32_t>;
94  } and
95  requires(T self, uint16_t col, uint16_t row, uint16_t tot) {
96  { self.get_hit(col, row) } -> std::same_as<uint16_t>;
97  { self.set_hit(col, row, tot) } -> std::same_as<void>;
98  } and
99  requires(T self, uint16_t qcol, uint16_t qrow, uint64_t qtot) {
100  { self.get_qcore(qcol, qrow) } -> std::same_as<uint64_t>;
101  { self.set_qcore(qcol, qrow, qtot) } -> std::same_as<void>;
102  };
103 
104 
105 
106 template<typename T>
107 concept HitSum =
108  std::constructible_from<T> and
109  std::destructible<T> and
110  requires(T self, uint16_t col, uint16_t row) {
111  { self.add_hit(col, row) } -> std::same_as<void>;
112  { self.get_sum(col, row) } -> std::same_as<typename T::sum_t>;
113  } and
114  requires(T self, uint16_t qcol, uint16_t qrow, uint16_t hitmap) {
115  { self.add_qcore(qcol, qrow, hitmap) } -> std::same_as<void>;
116  } and
117  requires(T self) {
118  { self.clear() } -> std::same_as<void>;
119  { self.get_status() } -> std::same_as<uint32_t>;
120  };
121 
122 } // concepts
123 
124 
125 
126 
127 namespace concepts = itk::pixel::datafmt::concepts;
128 // using namespace itk::pixel::datafmt;
129 
130 // static_assert(concepts::Hit<Hit>);
131 // static_assert(concepts::QCoreHit<QCoreHit>);
132 
133 // static_assert(concepts::HitVec<PixelVec, HitMap>);
134 // static_assert(concepts::HitVec<QCoreVec, HitMap>);
135 
136 // static_assert(concepts::HitMap<HitMap, PixelVec, QCoreVec>);
137 
138 // static_assert(concepts::HitSum<HitSum16>);
139 // static_assert(concepts::HitSum<HitSum32>);
140 // static_assert(concepts::HitSum<HitSum64>);
141 
142 
143 } // itk::pixel::datafmt
concept Hit
Concept for pixel Hit.
Definition: datafmt.hpp:18
concept HitVec
Concept for pixel hitmap HitMap.
Definition: datafmt.hpp:63
concept QCoreHit
Concept for pixel quad-core hits QCoreHit.
Definition: datafmt.hpp:40