| 470 | } |
| 471 | |
| 472 | IterationResult Run(ElementRange* range, ElementRange* child_range, |
| 473 | PathWriteContext* context) { |
| 474 | if (new_range_) { |
| 475 | // Reset the reader each time we are starting fresh on a range. |
| 476 | // We can't rely on continuity because nulls above can |
| 477 | // cause discontinuities. |
| 478 | valid_bits_reader_ = MakeReader(*range); |
| 479 | } |
| 480 | child_range->start = range->start; |
| 481 | ::arrow::internal::BitRun run = valid_bits_reader_.NextRun(); |
| 482 | if (!run.set) { |
| 483 | range->start += run.length; |
| 484 | RETURN_IF_ERROR(FillRepLevels(run.length, rep_level_if_null_, context)); |
| 485 | RETURN_IF_ERROR(context->AppendDefLevels(run.length, def_level_if_null_)); |
| 486 | run = valid_bits_reader_.NextRun(); |
| 487 | } |
| 488 | if (range->Empty()) { |
| 489 | new_range_ = true; |
| 490 | return kDone; |
| 491 | } |
| 492 | child_range->end = child_range->start = range->start; |
| 493 | child_range->end += run.length; |
| 494 | |
| 495 | DCHECK(!child_range->Empty()); |
| 496 | range->start += child_range->Size(); |
| 497 | new_range_ = false; |
| 498 | return kNext; |
| 499 | } |
| 500 | |
| 501 | const uint8_t* null_bitmap_; |
| 502 | int64_t entry_offset_; |
nothing calls this directly
no test coverage detected