pub struct SegmentReader { /* private fields */ }Expand description
Reader for multi-segment records with seeking support.
Handles automatic segment switching and provides unified access to signals across all segments in a multi-segment record.
§Examples
use wfdb::Record;
let record = Record::open("data/multi_segment_record")?;
let mut reader = record.segment_reader()?;
// Read frames across all segments
while let Some(frame) = reader.read_frame()? {
// Process frame...
}Implementations§
Source§impl SegmentReader
impl SegmentReader
Sourcepub fn read_frame(&mut self) -> Result<Option<Vec<Sample>>>
pub fn read_frame(&mut self) -> Result<Option<Vec<Sample>>>
Read one frame (one sample from each signal).
Returns None when all segments have been read.
§Errors
Returns an error if:
- A segment cannot be loaded
- A frame cannot be read
Examples found in repository?
examples/seek_record.rs (line 205)
157fn demonstrate_multi_segment_seeking(record: &Record) -> wfdb::Result<()> {
158 println!("\n=== Multi-Segment Record ===");
159 println!("Segments: {}", record.segment_count());
160
161 if let Some(segments) = record.segment_info() {
162 println!("\nSegment details:");
163 for (i, seg) in segments.iter().enumerate() {
164 println!(
165 " Segment {}: {} ({} samples)",
166 i, seg.record_name, seg.num_samples
167 );
168 }
169 }
170
171 println!("\n--- SegmentReader: Cross-segment Seeking ---");
172 let mut reader = record.segment_reader()?;
173
174 println!("Reading first 5 frames...");
175 let frames = reader.read_frames(5)?;
176 for (i, frame) in frames.iter().enumerate() {
177 println!(" Frame {i}: {frame:?}");
178 }
179 println!(
180 " Current position: sample {} (segment {})",
181 reader.position(),
182 reader.current_segment()
183 );
184
185 println!("\nSeeking to sample 100...");
186 match reader.seek_to_sample(100) {
187 Ok(pos) => {
188 println!(" Seek to sample: {pos}");
189 println!(" Now at segment: {}", reader.current_segment());
190
191 let frames = reader.read_frames(3)?;
192 for (i, frame) in frames.iter().enumerate() {
193 println!(" Frame {}: {:?}", 100 + i, frame);
194 }
195 println!(" Current position: sample {}", reader.position());
196 }
197 Err(e) => {
198 println!(" Seeking failed: {e}");
199 }
200 }
201
202 println!("\nReading sequentially across segments...");
203 reader.seek_to_sample(0)?;
204 let mut frame_count = 0;
205 while let Some(_frame) = reader.read_frame()? {
206 frame_count += 1;
207 if frame_count >= 10 {
208 println!(" Read {frame_count} frames across segments...");
209 break;
210 }
211 }
212 println!(
213 " Final position: sample {} (segment {})",
214 reader.position(),
215 reader.current_segment()
216 );
217
218 Ok(())
219}Sourcepub fn read_frames(&mut self, count: usize) -> Result<Vec<Vec<Sample>>>
pub fn read_frames(&mut self, count: usize) -> Result<Vec<Vec<Sample>>>
Examples found in repository?
examples/seek_record.rs (line 175)
157fn demonstrate_multi_segment_seeking(record: &Record) -> wfdb::Result<()> {
158 println!("\n=== Multi-Segment Record ===");
159 println!("Segments: {}", record.segment_count());
160
161 if let Some(segments) = record.segment_info() {
162 println!("\nSegment details:");
163 for (i, seg) in segments.iter().enumerate() {
164 println!(
165 " Segment {}: {} ({} samples)",
166 i, seg.record_name, seg.num_samples
167 );
168 }
169 }
170
171 println!("\n--- SegmentReader: Cross-segment Seeking ---");
172 let mut reader = record.segment_reader()?;
173
174 println!("Reading first 5 frames...");
175 let frames = reader.read_frames(5)?;
176 for (i, frame) in frames.iter().enumerate() {
177 println!(" Frame {i}: {frame:?}");
178 }
179 println!(
180 " Current position: sample {} (segment {})",
181 reader.position(),
182 reader.current_segment()
183 );
184
185 println!("\nSeeking to sample 100...");
186 match reader.seek_to_sample(100) {
187 Ok(pos) => {
188 println!(" Seek to sample: {pos}");
189 println!(" Now at segment: {}", reader.current_segment());
190
191 let frames = reader.read_frames(3)?;
192 for (i, frame) in frames.iter().enumerate() {
193 println!(" Frame {}: {:?}", 100 + i, frame);
194 }
195 println!(" Current position: sample {}", reader.position());
196 }
197 Err(e) => {
198 println!(" Seeking failed: {e}");
199 }
200 }
201
202 println!("\nReading sequentially across segments...");
203 reader.seek_to_sample(0)?;
204 let mut frame_count = 0;
205 while let Some(_frame) = reader.read_frame()? {
206 frame_count += 1;
207 if frame_count >= 10 {
208 println!(" Read {frame_count} frames across segments...");
209 break;
210 }
211 }
212 println!(
213 " Final position: sample {} (segment {})",
214 reader.position(),
215 reader.current_segment()
216 );
217
218 Ok(())
219}Sourcepub fn seek_to_sample(&mut self, sample: u64) -> Result<u64>
pub fn seek_to_sample(&mut self, sample: u64) -> Result<u64>
Seek to a specific sample number across all segments.
Automatically switches to the appropriate segment and positions the reader at the target sample.
Returns the actual sample position after seeking.
§Errors
Returns an error if:
- The segment containing the target sample cannot be loaded
- Seeking within the segment fails
Examples found in repository?
examples/seek_record.rs (line 186)
157fn demonstrate_multi_segment_seeking(record: &Record) -> wfdb::Result<()> {
158 println!("\n=== Multi-Segment Record ===");
159 println!("Segments: {}", record.segment_count());
160
161 if let Some(segments) = record.segment_info() {
162 println!("\nSegment details:");
163 for (i, seg) in segments.iter().enumerate() {
164 println!(
165 " Segment {}: {} ({} samples)",
166 i, seg.record_name, seg.num_samples
167 );
168 }
169 }
170
171 println!("\n--- SegmentReader: Cross-segment Seeking ---");
172 let mut reader = record.segment_reader()?;
173
174 println!("Reading first 5 frames...");
175 let frames = reader.read_frames(5)?;
176 for (i, frame) in frames.iter().enumerate() {
177 println!(" Frame {i}: {frame:?}");
178 }
179 println!(
180 " Current position: sample {} (segment {})",
181 reader.position(),
182 reader.current_segment()
183 );
184
185 println!("\nSeeking to sample 100...");
186 match reader.seek_to_sample(100) {
187 Ok(pos) => {
188 println!(" Seek to sample: {pos}");
189 println!(" Now at segment: {}", reader.current_segment());
190
191 let frames = reader.read_frames(3)?;
192 for (i, frame) in frames.iter().enumerate() {
193 println!(" Frame {}: {:?}", 100 + i, frame);
194 }
195 println!(" Current position: sample {}", reader.position());
196 }
197 Err(e) => {
198 println!(" Seeking failed: {e}");
199 }
200 }
201
202 println!("\nReading sequentially across segments...");
203 reader.seek_to_sample(0)?;
204 let mut frame_count = 0;
205 while let Some(_frame) = reader.read_frame()? {
206 frame_count += 1;
207 if frame_count >= 10 {
208 println!(" Read {frame_count} frames across segments...");
209 break;
210 }
211 }
212 println!(
213 " Final position: sample {} (segment {})",
214 reader.position(),
215 reader.current_segment()
216 );
217
218 Ok(())
219}Sourcepub const fn position(&self) -> u64
pub const fn position(&self) -> u64
Get current sample position across all segments.
Examples found in repository?
examples/seek_record.rs (line 181)
157fn demonstrate_multi_segment_seeking(record: &Record) -> wfdb::Result<()> {
158 println!("\n=== Multi-Segment Record ===");
159 println!("Segments: {}", record.segment_count());
160
161 if let Some(segments) = record.segment_info() {
162 println!("\nSegment details:");
163 for (i, seg) in segments.iter().enumerate() {
164 println!(
165 " Segment {}: {} ({} samples)",
166 i, seg.record_name, seg.num_samples
167 );
168 }
169 }
170
171 println!("\n--- SegmentReader: Cross-segment Seeking ---");
172 let mut reader = record.segment_reader()?;
173
174 println!("Reading first 5 frames...");
175 let frames = reader.read_frames(5)?;
176 for (i, frame) in frames.iter().enumerate() {
177 println!(" Frame {i}: {frame:?}");
178 }
179 println!(
180 " Current position: sample {} (segment {})",
181 reader.position(),
182 reader.current_segment()
183 );
184
185 println!("\nSeeking to sample 100...");
186 match reader.seek_to_sample(100) {
187 Ok(pos) => {
188 println!(" Seek to sample: {pos}");
189 println!(" Now at segment: {}", reader.current_segment());
190
191 let frames = reader.read_frames(3)?;
192 for (i, frame) in frames.iter().enumerate() {
193 println!(" Frame {}: {:?}", 100 + i, frame);
194 }
195 println!(" Current position: sample {}", reader.position());
196 }
197 Err(e) => {
198 println!(" Seeking failed: {e}");
199 }
200 }
201
202 println!("\nReading sequentially across segments...");
203 reader.seek_to_sample(0)?;
204 let mut frame_count = 0;
205 while let Some(_frame) = reader.read_frame()? {
206 frame_count += 1;
207 if frame_count >= 10 {
208 println!(" Read {frame_count} frames across segments...");
209 break;
210 }
211 }
212 println!(
213 " Final position: sample {} (segment {})",
214 reader.position(),
215 reader.current_segment()
216 );
217
218 Ok(())
219}Sourcepub fn total_samples(&self) -> u64
pub fn total_samples(&self) -> u64
Get total number of samples across all segments.
Sourcepub const fn current_segment(&self) -> usize
pub const fn current_segment(&self) -> usize
Get current segment index.
Examples found in repository?
examples/seek_record.rs (line 182)
157fn demonstrate_multi_segment_seeking(record: &Record) -> wfdb::Result<()> {
158 println!("\n=== Multi-Segment Record ===");
159 println!("Segments: {}", record.segment_count());
160
161 if let Some(segments) = record.segment_info() {
162 println!("\nSegment details:");
163 for (i, seg) in segments.iter().enumerate() {
164 println!(
165 " Segment {}: {} ({} samples)",
166 i, seg.record_name, seg.num_samples
167 );
168 }
169 }
170
171 println!("\n--- SegmentReader: Cross-segment Seeking ---");
172 let mut reader = record.segment_reader()?;
173
174 println!("Reading first 5 frames...");
175 let frames = reader.read_frames(5)?;
176 for (i, frame) in frames.iter().enumerate() {
177 println!(" Frame {i}: {frame:?}");
178 }
179 println!(
180 " Current position: sample {} (segment {})",
181 reader.position(),
182 reader.current_segment()
183 );
184
185 println!("\nSeeking to sample 100...");
186 match reader.seek_to_sample(100) {
187 Ok(pos) => {
188 println!(" Seek to sample: {pos}");
189 println!(" Now at segment: {}", reader.current_segment());
190
191 let frames = reader.read_frames(3)?;
192 for (i, frame) in frames.iter().enumerate() {
193 println!(" Frame {}: {:?}", 100 + i, frame);
194 }
195 println!(" Current position: sample {}", reader.position());
196 }
197 Err(e) => {
198 println!(" Seeking failed: {e}");
199 }
200 }
201
202 println!("\nReading sequentially across segments...");
203 reader.seek_to_sample(0)?;
204 let mut frame_count = 0;
205 while let Some(_frame) = reader.read_frame()? {
206 frame_count += 1;
207 if frame_count >= 10 {
208 println!(" Read {frame_count} frames across segments...");
209 break;
210 }
211 }
212 println!(
213 " Final position: sample {} (segment {})",
214 reader.position(),
215 reader.current_segment()
216 );
217
218 Ok(())
219}Sourcepub const fn num_segments(&self) -> usize
pub const fn num_segments(&self) -> usize
Get total number of segments.
Auto Trait Implementations§
impl Freeze for SegmentReader
impl !RefUnwindSafe for SegmentReader
impl Send for SegmentReader
impl !Sync for SegmentReader
impl Unpin for SegmentReader
impl !UnwindSafe for SegmentReader
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more