Skip to content

Commit 36a2fac

Browse files
committed
Use ExactSizeIterator in BooleanArray::from_trusted_len_iter
1 parent 4c3d5cc commit 36a2fac

File tree

3 files changed

+6
-7
lines changed

3 files changed

+6
-7
lines changed

arrow-array/src/array/boolean_array.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,8 @@ impl BooleanArray {
497497
/// # Safety
498498
///
499499
/// The iterator must be [`TrustedLen`](https://doc.rust-lang.org/std/iter/trait.TrustedLen.html).
500-
/// I.e. that `size_hint().1` correctly reports its length.
500+
/// I.e. that `size_hint().1` correctly reports its length. Note that this is a stronger
501+
/// guarantee that `ExactSizeIterator` provides which could still report a wrong length.
501502
///
502503
/// # Panics
503504
///
@@ -506,11 +507,9 @@ impl BooleanArray {
506507
pub unsafe fn from_trusted_len_iter<I, P>(iter: I) -> Self
507508
where
508509
P: Into<BooleanAdapter>,
509-
I: IntoIterator<Item = P>,
510+
I: ExactSizeIterator<Item = P>,
510511
{
511-
let iter = iter.into_iter();
512-
let (_, data_len) = iter.size_hint();
513-
let data_len = data_len.expect("Iterator must be sized");
512+
let data_len = iter.len();
514513

515514
let num_bytes = bit_util::ceil(data_len, 8);
516515
let mut null_builder = MutableBuffer::from_len_zeroed(num_bytes);

arrow-array/src/builder/boolean_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ impl Extend<Option<bool>> for BooleanBuilder {
237237
let buffered = iter.into_iter().collect::<Vec<_>>();
238238
let array = unsafe {
239239
// SAFETY: buffered.into_iter() is a trusted length iterator
240-
BooleanArray::from_trusted_len_iter(buffered)
240+
BooleanArray::from_trusted_len_iter(buffered.into_iter())
241241
};
242242
self.append_array(&array)
243243
}

arrow/benches/array_from.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ fn array_from_vec_benchmark(c: &mut Criterion) {
209209
fn gen_option_iter<TItem: Clone + 'static>(
210210
item: TItem,
211211
len: usize,
212-
) -> Box<dyn Iterator<Item = Option<TItem>>> {
212+
) -> Box<dyn ExactSizeIterator<Item = Option<TItem>>> {
213213
hint::black_box(Box::new(repeat_n(item, len).enumerate().map(
214214
|(idx, item)| {
215215
if idx % 3 == 0 {

0 commit comments

Comments
 (0)