Creates a [`GenericByteArray`] based on an iterator of values without nulls
(iter: I)
| 215 | |
| 216 | /// Creates a [`GenericByteArray`] based on an iterator of values without nulls |
| 217 | pub fn from_iter_values<Ptr, I>(iter: I) -> Self |
| 218 | where |
| 219 | Ptr: AsRef<T::Native>, |
| 220 | I: IntoIterator<Item = Ptr>, |
| 221 | { |
| 222 | let iter = iter.into_iter(); |
| 223 | let (_, data_len) = iter.size_hint(); |
| 224 | let data_len = data_len.expect("Iterator must be sized"); // panic if no upper bound. |
| 225 | |
| 226 | let mut offsets = MutableBuffer::new((data_len + 1) * std::mem::size_of::<T::Offset>()); |
| 227 | offsets.push(T::Offset::usize_as(0)); |
| 228 | |
| 229 | let mut values = MutableBuffer::new(0); |
| 230 | for s in iter { |
| 231 | let s: &[u8] = s.as_ref().as_ref(); |
| 232 | values.extend_from_slice(s); |
| 233 | offsets.push(T::Offset::usize_as(values.len())); |
| 234 | } |
| 235 | |
| 236 | T::Offset::from_usize(values.len()).expect("offset overflow"); |
| 237 | let offsets = Buffer::from(offsets); |
| 238 | |
| 239 | // Safety: valid by construction |
| 240 | let value_offsets = unsafe { OffsetBuffer::new_unchecked(offsets.into()) }; |
| 241 | |
| 242 | Self { |
| 243 | data_type: T::DATA_TYPE, |
| 244 | value_data: values.into(), |
| 245 | value_offsets, |
| 246 | nulls: None, |
| 247 | } |
| 248 | } |
| 249 | |
| 250 | /// Deconstruct this array into its constituent parts |
| 251 | pub fn into_parts(self) -> (OffsetBuffer<T::Offset>, Buffer, Option<NullBuffer>) { |