Returns `GenericByteBuilder` of this byte array for mutating its values if the underlying offset and data buffers are not shared by others.
(self)
| 371 | /// Returns `GenericByteBuilder` of this byte array for mutating its values if the underlying |
| 372 | /// offset and data buffers are not shared by others. |
| 373 | pub fn into_builder(self) -> Result<GenericByteBuilder<T>, Self> { |
| 374 | let len = self.len(); |
| 375 | let value_len = T::Offset::as_usize(self.value_offsets()[len] - self.value_offsets()[0]); |
| 376 | |
| 377 | let data = self.into_data(); |
| 378 | let null_bit_buffer = data.nulls().map(|b| b.inner().sliced()); |
| 379 | |
| 380 | let element_len = std::mem::size_of::<T::Offset>(); |
| 381 | let offset_buffer = data.buffers()[0] |
| 382 | .slice_with_length(data.offset() * element_len, (len + 1) * element_len); |
| 383 | |
| 384 | let element_len = std::mem::size_of::<u8>(); |
| 385 | let value_buffer = data.buffers()[1] |
| 386 | .slice_with_length(data.offset() * element_len, value_len * element_len); |
| 387 | |
| 388 | drop(data); |
| 389 | |
| 390 | let try_mutable_null_buffer = match null_bit_buffer { |
| 391 | None => Ok(None), |
| 392 | Some(null_buffer) => { |
| 393 | // Null buffer exists, tries to make it mutable |
| 394 | null_buffer.into_mutable().map(Some) |
| 395 | } |
| 396 | }; |
| 397 | |
| 398 | let try_mutable_buffers = match try_mutable_null_buffer { |
| 399 | Ok(mutable_null_buffer) => { |
| 400 | // Got mutable null buffer, tries to get mutable value buffer |
| 401 | let try_mutable_offset_buffer = offset_buffer.into_mutable(); |
| 402 | let try_mutable_value_buffer = value_buffer.into_mutable(); |
| 403 | |
| 404 | // try_mutable_offset_buffer.map(...).map_err(...) doesn't work as the compiler complains |
| 405 | // mutable_null_buffer is moved into map closure. |
| 406 | match (try_mutable_offset_buffer, try_mutable_value_buffer) { |
| 407 | (Ok(mutable_offset_buffer), Ok(mutable_value_buffer)) => unsafe { |
| 408 | Ok(GenericByteBuilder::<T>::new_from_buffer( |
| 409 | mutable_offset_buffer, |
| 410 | mutable_value_buffer, |
| 411 | mutable_null_buffer, |
| 412 | )) |
| 413 | }, |
| 414 | (Ok(mutable_offset_buffer), Err(value_buffer)) => Err(( |
| 415 | mutable_offset_buffer.into(), |
| 416 | value_buffer, |
| 417 | mutable_null_buffer.map(|b| b.into()), |
| 418 | )), |
| 419 | (Err(offset_buffer), Ok(mutable_value_buffer)) => Err(( |
| 420 | offset_buffer, |
| 421 | mutable_value_buffer.into(), |
| 422 | mutable_null_buffer.map(|b| b.into()), |
| 423 | )), |
| 424 | (Err(offset_buffer), Err(value_buffer)) => Err(( |
| 425 | offset_buffer, |
| 426 | value_buffer, |
| 427 | mutable_null_buffer.map(|b| b.into()), |
| 428 | )), |
| 429 | } |
| 430 | } |