SegmentReader

Struct SegmentReader 

Source
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

Source

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}
Source

pub fn read_frames(&mut self, count: usize) -> Result<Vec<Vec<Sample>>>

Read multiple frames.

§Errors

Returns an error if:

  • A segment cannot be loaded
  • Frames cannot be read
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}
Source

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}
Source

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}
Source

pub fn total_samples(&self) -> u64

Get total number of samples across all segments.

Source

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}
Source

pub const fn num_segments(&self) -> usize

Get total number of segments.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.