Orion
high-rate readout
datafmt.hpp
1 // Data Formats for ITkPix
2 
3 #pragma once
4 
5 #include <vector>
6 #include <concepts>
7 #include <cstdint>
8 
9 
10 namespace itk::strip::datafmt {
11 
12 namespace concepts {
13 
14 template<typename T>
15 concept Hit =
16  std::constructible_from<T> and
17  std::constructible_from<T, uint8_t> and // (idx)
18  std::constructible_from<T, uint8_t, uint8_t> and // (col, row)
19  std::destructible<T> and
20  requires(T a, T b) {
21  a == b;
22  } and
23  requires(T self) {
24  { self.clear() } -> std::same_as<void>;
25  { self.get_idx() } -> std::same_as<uint8_t>;
26  { self.get_col() } -> std::same_as<uint8_t>;
27  { self.get_row() } -> std::same_as<uint8_t>;
28  } and
29  requires(T self, uint8_t col, uint8_t row) {
30  { self.set(col, row) } -> std::same_as<void>;
31  } and
32  requires(T self, uint8_t idx) {
33  { self.set(idx) } -> std::same_as<void>;
34  };
35 
36 
37 
38 template<typename T, typename HitMap>
39 concept HitVec =
40  std::constructible_from<T> and
41  std::constructible_from<T, const HitMap&> and
42  std::destructible<T> and
43  requires(T self) {
44  typename T::hit_t;
45  { self.hits } -> std::same_as<std::vector<typename T::hit_t>&>;
46  { self.clear() } -> std::same_as<void>;
47  { self.get_status() } -> std::same_as<uint32_t>;
48  } and
49  requires(T self, const typename T::hit_t& hit) {
50  { self.add_hit(hit) } -> std::same_as<void>;
51  } and
52  requires(T self, uint16_t idx, uint8_t next) {
53  { self.add_hit(idx) } -> std::same_as<void>;
54  { self.add_hit_next(idx, next) } -> std::same_as<void>;
55  };
56 
57 
58 
59 template<typename T, typename HitVec>
60 concept HitMap =
61  std::constructible_from<T> and
62  std::constructible_from<T, const HitVec&> and
63  std::destructible<T> and
64  requires(T self) {
65  { self.clear() } -> std::same_as<void>;
66  { self.get_status() } -> std::same_as<uint32_t>;
67  } and
68  requires(T self, uint8_t idx, uint8_t val) {
69  { self.get_hit(idx) } -> std::same_as<uint8_t>;
70  { self.set_hit(idx, val) } -> std::same_as<void>;
71  } and
72  requires(T self, uint8_t col, uint8_t row, uint8_t val) {
73  { self.get_hit(col, row) } -> std::same_as<uint8_t>;
74  { self.set_hit(col, row, val) } -> std::same_as<void>;
75  };
76 
77 
78 
79 template<typename T>
80 concept HitSum =
81  std::constructible_from<T> and
82  std::destructible<T> and
83  requires(T self) {
84  { self.clear() } -> std::same_as<void>;
85  { self.get_status() } -> std::same_as<uint32_t>;
86  } and
87  requires(T self, uint8_t idx, typename T::sum_t cnt) {
88  { self.add_hit(idx) } -> std::same_as<void>;
89  { self.add_hits(idx, cnt) } -> std::same_as<void>;
90  } and
91  requires(T self, uint8_t col, uint8_t row, typename T::sum_t cnt) {
92  { self.add_hit(col, row) } -> std::same_as<void>;
93  { self.add_hits(col, row, cnt) } -> std::same_as<void>;
94  } and
95  requires(T self, uint8_t addr, uint32_t cntreg) {
96  { self.add_cntreg(addr, cntreg) } -> std::same_as<void>;
97  } and
98  requires(T self, uint8_t idx) {
99  { self.get_sum(idx) } -> std::same_as<typename T::sum_t>;
100  } and
101  requires(T self, uint8_t col, uint8_t row) {
102  { self.get_sum(col, row) } -> std::same_as<typename T::sum_t>;
103  };
104 
105 } // concepts
106 
107 
108 
109 
110 
111 namespace concepts = itk::strip::datafmt::concepts;
112 using namespace itk::strip::datafmt;
113 
114 // static_assert(concepts::Hit<Hit>);
115 
116 // static_assert(concepts::HitVec<StripVec, HitMap>);
117 
118 // static_assert(concepts::HitMap<HitMap, StripVec>);
119 
120 // static_assert(concepts::HitSum<HitSum16>);
121 // static_assert(concepts::HitSum<HitSum32>);
122 // static_assert(concepts::HitSum<HitSum64>);
123 
124 
125 } // itk::strip::datafmt
concept Hit
Concept for pixel Hit.
Definition: datafmt.hpp:18
concept HitVec
Concept for pixel hitmap HitMap.
Definition: datafmt.hpp:63