1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
use serde::{Deserialize, Serialize};
use std::fmt;
use std::fmt::Debug;
use std::ops::Range;

// TODO: Manually implement Deserialize to avoid soundness hole
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NestedVec<T> {
    data: Vec<T>,
    offsets_begin: Vec<usize>,
    offsets_end: Vec<usize>,
}

impl<T: Debug> Debug for NestedVec<T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_list().entries(self.iter()).finish()
    }
}

impl<T> Default for NestedVec<T> {
    fn default() -> Self {
        Self::new()
    }
}

impl<T> NestedVec<T> {
    pub fn new() -> Self {
        Self {
            data: Vec::new(),
            offsets_begin: Vec::new(),
            offsets_end: Vec::new(),
        }
    }

    /// Return a data structure that can be used for appending single elements to the same array.
    /// When the returned data structure is dropped, the result is equivalent to
    /// adding the array at once with `CompactArrayStorage::push`.
    ///
    /// TODO: Need better name
    pub fn begin_array<'a>(&'a mut self) -> ArrayAppender<'a, T> {
        let initial_count = self.data.len();
        ArrayAppender {
            initial_count,
            data: &mut self.data,
            offsets_begin: &mut self.offsets_begin,
            offsets_end: &mut self.offsets_end,
        }
    }

    pub fn iter<'a>(&'a self) -> impl 'a + Iterator<Item = &'a [T]> {
        (0..self.len()).map(move |i| self.get(i).unwrap())
    }

    pub fn len(&self) -> usize {
        self.offsets_begin.len()
    }

    /// Returns an iterator over all elements inside all arrays.
    pub fn iter_array_elements<'a>(&'a self) -> impl 'a + Iterator<Item = &'a T> {
        self.iter().flatten()
    }

    pub fn total_num_elements(&self) -> usize {
        self.offsets_begin
            .iter()
            .zip(&self.offsets_end)
            .map(|(begin, end)| end - begin)
            .sum()
    }

    pub fn get(&self, index: usize) -> Option<&[T]> {
        let range = self.get_index_range(index)?;
        self.data.get(range)
    }

    pub fn get_mut(&mut self, index: usize) -> Option<&mut [T]> {
        let range = self.get_index_range(index)?;
        self.data.get_mut(range)
    }

    fn get_index_range(&self, index: usize) -> Option<Range<usize>> {
        let begin = *self.offsets_begin.get(index)?;
        let end = *self.offsets_end.get(index)?;
        Some(begin..end)
    }

    pub fn first(&self) -> Option<&[T]> {
        self.get(0)
    }

    pub fn first_mut(&mut self) -> Option<&mut [T]> {
        self.get_mut(0)
    }

    fn get_last_range(&self) -> Option<Range<usize>> {
        let begin = *self.offsets_begin.last()?;
        let end = *self.offsets_end.last()?;
        Some(begin..end)
    }

    pub fn last(&self) -> Option<&[T]> {
        let range = self.get_last_range()?;
        self.data.get(range)
    }

    pub fn last_mut(&mut self) -> Option<&mut [T]> {
        let range = self.get_last_range()?;
        self.data.get_mut(range)
    }

    pub fn clear(&mut self) {
        self.offsets_end.clear();
        self.offsets_begin.clear();
        self.data.clear();
    }
}

#[derive(Debug)]
pub struct ArrayAppender<'a, T> {
    data: &'a mut Vec<T>,
    offsets_begin: &'a mut Vec<usize>,
    offsets_end: &'a mut Vec<usize>,
    initial_count: usize,
}

impl<'a, T> ArrayAppender<'a, T> {
    pub fn push_single(&mut self, element: T) -> &mut Self {
        self.data.push(element);
        self
    }

    pub fn count(&self) -> usize {
        self.data.len() - self.initial_count
    }
}

impl<'a, T> Drop for ArrayAppender<'a, T> {
    fn drop(&mut self) {
        self.offsets_begin.push(self.initial_count);
        self.offsets_end.push(self.data.len());
    }
}

impl<T: Clone> NestedVec<T> {
    pub fn push(&mut self, array: &[T]) {
        self.offsets_begin.push(self.data.len());
        self.data.extend_from_slice(array);
        self.offsets_end.push(self.data.len());
    }
}

impl<'a, T: Clone> From<&'a Vec<Vec<T>>> for NestedVec<T> {
    fn from(nested_vec: &'a Vec<Vec<T>>) -> Self {
        let mut result = Self::new();
        for vec in nested_vec {
            result.push(vec);
        }
        result
    }
}

impl<T: Clone> From<Vec<Vec<T>>> for NestedVec<T> {
    fn from(vec_vec: Vec<Vec<T>>) -> Self {
        Self::from(&vec_vec)
    }
}

impl<'a, T: Clone> From<&'a NestedVec<T>> for Vec<Vec<T>> {
    fn from(nested: &NestedVec<T>) -> Self {
        nested.iter().map(|slice| slice.to_vec()).collect()
    }
}

impl<'a, T: Clone> From<NestedVec<T>> for Vec<Vec<T>> {
    fn from(nested: NestedVec<T>) -> Self {
        Self::from(&nested)
    }
}