1use std::{borrow::Cow, hash::Hash};
2
3use serde::{Deserialize, Serialize};
4
5use crate::row::{KeyRowDe, KeyRowSer, RowDe, RowSer};
6
7#[derive(Debug, PartialEq, Clone)]
11pub struct ColumnarVec<'c, T, IT>(pub Cow<'c, IT>)
12where
13 for<'a> &'a IT: IntoIterator<Item = &'a T>,
14 IT: FromIterator<T> + Clone;
15
16impl<'c, T, IT> ColumnarVec<'c, T, IT>
17where
18 IT: FromIterator<T> + Clone,
19 for<'a> &'a IT: IntoIterator<Item = &'a T>,
20{
21 pub fn new(vec: &'c IT) -> Self {
22 Self(Cow::Borrowed(vec))
23 }
24
25 pub fn into_vec(self) -> IT {
26 self.0.into_owned()
27 }
28}
29
30impl<T, IT> From<IT> for ColumnarVec<'_, T, IT>
31where
32 IT: FromIterator<T> + Clone,
33 for<'a> &'a IT: IntoIterator<Item = &'a T>,
34{
35 fn from(vec: IT) -> Self {
36 Self(Cow::Owned(vec))
37 }
38}
39
40impl<'c, T, IT> From<&'c IT> for ColumnarVec<'c, T, IT>
41where
42 IT: FromIterator<T> + Clone,
43 for<'a> &'a IT: IntoIterator<Item = &'a T>,
44{
45 fn from(vec: &'c IT) -> Self {
46 Self(Cow::Borrowed(vec))
47 }
48}
49
50impl<'c, T, IT> Serialize for ColumnarVec<'c, T, IT>
51where
52 T: RowSer<IT>,
53 IT: FromIterator<T> + Clone,
54 for<'a> &'a IT: IntoIterator<Item = &'a T>,
55{
56 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57 where
58 S: serde::Serializer,
59 {
60 T::serialize_columns(&self.0, serializer)
61 }
62}
63
64impl<'de, 'c, T, IT> Deserialize<'de> for ColumnarVec<'c, T, IT>
65where
66 T: RowDe<'de, IT>,
67 IT: FromIterator<T> + Clone,
68 for<'a> &'a IT: IntoIterator<Item = &'a T>,
69{
70 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71 where
72 D: serde::Deserializer<'de>,
73 {
74 Ok(ColumnarVec(Cow::Owned(T::deserialize_columns(
75 deserializer,
76 )?)))
77 }
78}
79
80#[derive(Debug, PartialEq, Clone, Eq)]
84pub struct ColumnarMap<'c, K, T, IT>(pub Cow<'c, IT>)
85where
86 for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
87 IT: FromIterator<(K, T)> + Clone,
88 K: Eq + Clone;
89
90impl<'c, K, T, IT> ColumnarMap<'c, K, T, IT>
91where
92 for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
93 IT: FromIterator<(K, T)> + Clone,
94 K: Eq + Clone,
95{
96 pub fn new(map: &'c IT) -> Self {
97 Self(Cow::Borrowed(map))
98 }
99
100 pub fn into_map(self) -> IT {
101 self.0.into_owned()
102 }
103}
104
105impl<'c, K, T, IT> Serialize for ColumnarMap<'c, K, T, IT>
106where
107 T: KeyRowSer<K, IT>,
108 for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
109 IT: FromIterator<(K, T)> + Clone,
110 K: Serialize + PartialEq + Eq + Hash + Clone,
111{
112 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
113 where
114 S: serde::Serializer,
115 {
116 T::serialize_columns(&self.0, serializer)
117 }
118}
119
120impl<'de, 'c, K, T, IT> Deserialize<'de> for ColumnarMap<'c, K, T, IT>
121where
122 T: KeyRowDe<'de, K, IT>,
123 for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
124 IT: FromIterator<(K, T)> + Clone,
125 K: Deserialize<'de> + PartialEq + Eq + Hash + Clone,
126{
127 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
128 where
129 D: serde::Deserializer<'de>,
130 {
131 Ok(ColumnarMap(Cow::Owned(T::deserialize_columns(
132 deserializer,
133 )?)))
134 }
135}
136
137impl<'c, T, IT> Default for ColumnarVec<'c, T, IT>
138where
139 IT: FromIterator<T> + Clone + Default,
140 for<'a> &'a IT: IntoIterator<Item = &'a T>,
141{
142 fn default() -> Self {
143 Self(Default::default())
144 }
145}
146
147impl<'de, 'c, K, T, IT> Default for ColumnarMap<'c, K, T, IT>
148where
149 T: KeyRowDe<'de, K, IT>,
150 for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
151 IT: FromIterator<(K, T)> + Clone + Default,
152 K: Deserialize<'de> + PartialEq + Eq + Hash + Clone,
153{
154 fn default() -> Self {
155 Self(Default::default())
156 }
157}