hff_core/write/
data_array.rs

1use super::DataSource;
2use crate::Result;
3use std::ops::{Deref, DerefMut};
4
5/// Storage of data sources for writing the hff content.
6#[derive(Debug)]
7pub struct DataArray<'a> {
8    /// The vector of data sources.
9    data: Vec<DataSource<'a>>,
10}
11
12impl<'a> DataArray<'a> {
13    /// Create a new empty data array.
14    pub fn new() -> Self {
15        Self { data: vec![] }
16    }
17
18    /// Push a new data source onto the array.
19    pub fn push(&mut self, item: DataSource<'a>) {
20        self.data.push(item);
21    }
22
23    /// Prepare the data in the array.
24    pub fn prepare(&mut self) -> Result<Vec<(u64, u64)>> {
25        let mut offset_len = vec![];
26        let mut offset = 0;
27        for entry in &mut self.data {
28            let length = if let Some(length) = entry.len() {
29                length as u64
30            } else {
31                entry.prepare()?
32            };
33            offset_len.push((offset, length));
34
35            let padding = length.next_multiple_of(16) - length;
36            offset += length + padding;
37        }
38
39        Ok(offset_len)
40    }
41}
42
43impl<'a> IntoIterator for DataArray<'a> {
44    type Item = DataSource<'a>;
45    type IntoIter = std::vec::IntoIter<Self::Item>;
46
47    fn into_iter(self) -> Self::IntoIter {
48        self.data.into_iter()
49    }
50}
51
52impl<'a> Deref for DataArray<'a> {
53    type Target = [DataSource<'a>];
54
55    fn deref(&self) -> &Self::Target {
56        &self.data
57    }
58}
59
60impl<'a> DerefMut for DataArray<'a> {
61    fn deref_mut(&mut self) -> &mut Self::Target {
62        &mut self.data
63    }
64}