1use crate::{Datum, RowRef};
20
21#[derive(Debug, Default, Clone)]
23pub struct DatumVec {
24 outer: Vec<Datum<'static>>,
25}
26
27impl DatumVec {
28 pub fn new() -> Self {
30 Self { outer: Vec::new() }
31 }
32 pub fn borrow<'a>(&'a mut self) -> DatumVecBorrow<'a> {
36 let inner = std::mem::take(&mut self.outer);
37 DatumVecBorrow {
38 outer: &mut self.outer,
39 inner,
40 }
41 }
42
43 pub fn borrow_with<'a>(&'a mut self, row: &'a RowRef) -> DatumVecBorrow<'a> {
45 let mut borrow = self.borrow();
46 borrow.extend(row.iter());
47 borrow
48 }
49
50 pub fn borrow_with_limit<'a>(
54 &'a mut self,
55 row: &'a RowRef,
56 limit: usize,
57 ) -> DatumVecBorrow<'a> {
58 let mut borrow = self.borrow();
59 borrow.extend(row.iter().take(limit));
60 borrow
61 }
62}
63
64#[derive(Debug)]
69pub struct DatumVecBorrow<'outer> {
70 outer: &'outer mut Vec<Datum<'static>>,
71 inner: Vec<Datum<'outer>>,
72}
73
74impl<'outer> Drop for DatumVecBorrow<'outer> {
75 fn drop(&mut self) {
76 *self.outer = mz_ore::vec::repurpose_allocation(std::mem::take(&mut self.inner));
77 }
78}
79
80impl<'outer> std::ops::Deref for DatumVecBorrow<'outer> {
81 type Target = Vec<Datum<'outer>>;
82 fn deref(&self) -> &Self::Target {
83 &self.inner
84 }
85}
86
87impl<'outer> std::ops::DerefMut for DatumVecBorrow<'outer> {
88 fn deref_mut(&mut self) -> &mut Self::Target {
89 &mut self.inner
90 }
91}
92
93#[cfg(test)]
94mod test {
95 use super::*;
96 use crate::Row;
97
98 #[mz_ore::test]
99 fn miri_test_datum_vec() {
100 let mut d = DatumVec::new();
101
102 assert_eq!(d.borrow().len(), 0);
103
104 let r = Row::pack_slice(&[Datum::String("first"), Datum::Dummy]);
105
106 {
107 let borrow = d.borrow_with(&r);
108 assert_eq!(borrow.len(), 2);
109 assert_eq!(borrow[0], Datum::String("first"));
110 }
111
112 {
113 let r2 = Row::pack_slice(&[Datum::String("second")]);
115 let mut borrow = d.borrow();
116 borrow.extend(&r);
117 borrow.extend(&r2);
118 assert_eq!(borrow.len(), 3);
119 assert_eq!(borrow[2], Datum::String("second"));
120 }
121 }
122}