hff_core/write/
data_array.rs1use super::DataSource;
2use crate::Result;
3use std::ops::{Deref, DerefMut};
4
5#[derive(Debug)]
7pub struct DataArray<'a> {
8 data: Vec<DataSource<'a>>,
10}
11
12impl<'a> DataArray<'a> {
13 pub fn new() -> Self {
15 Self { data: vec![] }
16 }
17
18 pub fn push(&mut self, item: DataSource<'a>) {
20 self.data.push(item);
21 }
22
23 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}