| 570 | |
| 571 | template <class TTo> |
| 572 | void Export(size_t pos, TTo& to) const { |
| 573 | static_assert(std::is_unsigned<TTo>::value, "expect std::is_unsigned<TTo>::value"); |
| 574 | to = 0; |
| 575 | size_t chunkpos = pos >> DivCount; |
| 576 | if (chunkpos >= Mask.GetChunkCapacity()) { |
| 577 | return; |
| 578 | } |
| 579 | if ((pos & ModMask) == 0) { |
| 580 | if (sizeof(TChunk) >= sizeof(TTo)) { |
| 581 | to = (TTo)Mask.Data[chunkpos]; |
| 582 | } else { // if (sizeof(TChunk) < sizeof(TTo)) |
| 583 | NBitMapPrivate::CopyData(&to, 1, Mask.Data + chunkpos, Min(((sizeof(TTo) * 8) >> DivCount), Mask.GetChunkCapacity() - chunkpos)); |
| 584 | } |
| 585 | } else if ((pos & (sizeof(TTo) * 8 - 1)) == 0 && sizeof(TChunk) >= 2 * sizeof(TTo)) { |
| 586 | to = (TTo)(Mask.Data[chunkpos] >> (pos & ModMask)); |
| 587 | } else { |
| 588 | static constexpr size_t copyToSize = (sizeof(TChunk) >= sizeof(TTo)) ? (sizeof(TChunk) / sizeof(TTo)) + 2 : 3; |
| 589 | TTo temp[copyToSize] = {0, 0}; |
| 590 | // or use non defined by now TBitmap<copyToSize, TTo>::CopyData,RShift(pos & ModMask),Export(0,to) |
| 591 | NBitMapPrivate::CopyData(temp, copyToSize, Mask.Data + chunkpos, Min((sizeof(TTo) / sizeof(TChunk)) + 1, Mask.GetChunkCapacity() - chunkpos)); |
| 592 | to = (temp[0] >> (pos & ModMask)) | (temp[1] << (8 * sizeof(TTo) - (pos & ModMask))); |
| 593 | } |
| 594 | } |
| 595 | |
| 596 | Y_FORCE_INLINE bool Test(size_t n) const { |
| 597 | return Get(n); |
no test coverage detected