Skip to main content

fpm_rs/measurements/
read.rs

1use std::{ops::Deref, sync::Arc};
2
3use crate::Result;
4
5use super::{FrameMetadata, LazyMeasurementStack, MeasurementStack};
6
7/// Read-only measurement access used by reconstruction algorithms.
8///
9/// Implementations retain responsibility for storage, caching, preprocessing,
10/// and mutation. The opaque frame view may borrow directly from the
11/// implementation or own a shared cache handle.
12pub trait MeasurementRead: Sync {
13    fn frame_count(&self) -> usize;
14
15    fn image_shape(&self) -> (usize, usize);
16
17    fn frame_len(&self) -> usize;
18
19    fn frame(&self, index: usize) -> Result<impl Deref<Target = [f64]> + '_>;
20
21    fn frame_weight(&self, index: usize) -> Result<f64>;
22
23    fn frame_mask(&self, index: usize) -> Result<Option<&[u8]>>;
24
25    fn frame_metadata(&self) -> &[FrameMetadata];
26
27    fn validate(&self) -> Result<()>;
28}
29
30impl MeasurementRead for MeasurementStack {
31    fn frame_count(&self) -> usize {
32        MeasurementStack::frame_count(self)
33    }
34
35    fn image_shape(&self) -> (usize, usize) {
36        MeasurementStack::image_shape(self)
37    }
38
39    fn frame_len(&self) -> usize {
40        MeasurementStack::frame_len(self)
41    }
42
43    fn frame(&self, index: usize) -> Result<impl Deref<Target = [f64]> + '_> {
44        MeasurementStack::frame(self, index)
45    }
46
47    fn frame_weight(&self, index: usize) -> Result<f64> {
48        MeasurementStack::frame_weight(self, index)
49    }
50
51    fn frame_mask(&self, index: usize) -> Result<Option<&[u8]>> {
52        MeasurementStack::frame_mask(self, index)
53    }
54
55    fn frame_metadata(&self) -> &[FrameMetadata] {
56        &self.frame_metadata
57    }
58
59    fn validate(&self) -> Result<()> {
60        MeasurementStack::validate(self)
61    }
62}
63
64struct SharedFrame(Arc<Vec<f64>>);
65
66impl Deref for SharedFrame {
67    type Target = [f64];
68
69    fn deref(&self) -> &Self::Target {
70        self.0.as_slice()
71    }
72}
73
74impl MeasurementRead for LazyMeasurementStack {
75    fn frame_count(&self) -> usize {
76        LazyMeasurementStack::frame_count(self)
77    }
78
79    fn image_shape(&self) -> (usize, usize) {
80        LazyMeasurementStack::image_shape(self)
81    }
82
83    fn frame_len(&self) -> usize {
84        LazyMeasurementStack::frame_len(self)
85    }
86
87    fn frame(&self, index: usize) -> Result<impl Deref<Target = [f64]> + '_> {
88        LazyMeasurementStack::frame(self, index).map(SharedFrame)
89    }
90
91    fn frame_weight(&self, index: usize) -> Result<f64> {
92        LazyMeasurementStack::frame_weight(self, index)
93    }
94
95    fn frame_mask(&self, index: usize) -> Result<Option<&[u8]>> {
96        LazyMeasurementStack::frame_mask(self, index)
97    }
98
99    fn frame_metadata(&self) -> &[FrameMetadata] {
100        LazyMeasurementStack::frame_metadata(self)
101    }
102
103    fn validate(&self) -> Result<()> {
104        LazyMeasurementStack::validate(self)
105    }
106}