| 330 | typename Word = typename std::decay< |
| 331 | internal::call_traits::argument_type<0, Visitor&&>>::type::value_type> |
| 332 | static void VisitWordsAndWrite(const std::array<Bitmap, N>& bitmaps_arg, |
| 333 | std::array<Bitmap, M>* out_bitmaps_arg, |
| 334 | Visitor&& visitor) { |
| 335 | int64_t bit_length = BitLength(bitmaps_arg); |
| 336 | assert(bit_length == BitLength(*out_bitmaps_arg)); |
| 337 | |
| 338 | // if both input and output bitmaps have no byte offset, then use special template |
| 339 | if (std::all_of(bitmaps_arg.begin(), bitmaps_arg.end(), |
| 340 | [](const Bitmap& b) { return b.offset_ % 8 == 0; }) && |
| 341 | std::all_of(out_bitmaps_arg->begin(), out_bitmaps_arg->end(), |
| 342 | [](const Bitmap& b) { return b.offset_ % 8 == 0; })) { |
| 343 | std::array<BitmapWordReader<Word, /*may_have_byte_offset=*/false>, N> readers; |
| 344 | for (size_t i = 0; i < N; ++i) { |
| 345 | const Bitmap& in_bitmap = bitmaps_arg[i]; |
| 346 | readers[i] = BitmapWordReader<Word, /*may_have_byte_offset=*/false>( |
| 347 | in_bitmap.data_, in_bitmap.offset_, in_bitmap.length_); |
| 348 | } |
| 349 | |
| 350 | std::array<BitmapWordWriter<Word, /*may_have_byte_offset=*/false>, M> writers; |
| 351 | for (size_t i = 0; i < M; ++i) { |
| 352 | const Bitmap& out_bitmap = out_bitmaps_arg->at(i); |
| 353 | writers[i] = BitmapWordWriter<Word, /*may_have_byte_offset=*/false>( |
| 354 | out_bitmap.mutable_data_, out_bitmap.offset_, out_bitmap.length_); |
| 355 | } |
| 356 | |
| 357 | RunVisitWordsAndWriteLoop(bit_length, readers, writers, visitor); |
| 358 | } else { |
| 359 | std::array<BitmapWordReader<Word>, N> readers; |
| 360 | for (size_t i = 0; i < N; ++i) { |
| 361 | const Bitmap& in_bitmap = bitmaps_arg[i]; |
| 362 | readers[i] = |
| 363 | BitmapWordReader<Word>(in_bitmap.data_, in_bitmap.offset_, in_bitmap.length_); |
| 364 | } |
| 365 | |
| 366 | std::array<BitmapWordWriter<Word>, M> writers; |
| 367 | for (size_t i = 0; i < M; ++i) { |
| 368 | const Bitmap& out_bitmap = out_bitmaps_arg->at(i); |
| 369 | writers[i] = BitmapWordWriter<Word>(out_bitmap.mutable_data_, out_bitmap.offset_, |
| 370 | out_bitmap.length_); |
| 371 | } |
| 372 | |
| 373 | RunVisitWordsAndWriteLoop(bit_length, readers, writers, visitor); |
| 374 | } |
| 375 | } |
| 376 | |
| 377 | const uint8_t* data() const { return data_; } |
| 378 | uint8_t* mutable_data() { return mutable_data_; } |