/usr/local/lib64/python3.6/site-packages/pyarrow/include/arrow/util
NameSizeModeActions
algorithm.h12290644editdlrm
aligned_storage.h43020644editdlrm
align_util.h26360644editdlrm
async_generator.h640880644editdlrm
async_util.h96330644editdlrm
atomic_shared_ptr.h36400644editdlrm
base64.h10980644editdlrm
basic_decimal.h203340644editdlrm
benchmark_util.h45840644editdlrm
bitmap.h174630644editdlrm
bitmap_builders.h15630644editdlrm
bitmap_generate.h35630644editdlrm
bitmap_ops.h90840644editdlrm
bitmap_reader.h83470644editdlrm
bitmap_visit.h34600644editdlrm
bitmap_writer.h93600644editdlrm
bitset_stack.h27890644editdlrm
bit_block_counter.h191410644editdlrm
bit_run_reader.h165990644editdlrm
bit_stream_utils.h169860644editdlrm
bit_util.h115680644editdlrm
bpacking.h11750644editdlrm
bpacking64_default.h1959340644editdlrm
bpacking_avx2.h10090644editdlrm
bpacking_avx512.h10110644editdlrm
bpacking_default.h1032320644editdlrm
bpacking_neon.h10090644editdlrm
bpacking_simd128_generated.h985290644editdlrm
bpacking_simd256_generated.h774750644editdlrm
bpacking_simd512_generated.h670810644editdlrm
byte_stream_split.h287840644editdlrm
cancel.h29110644editdlrm
checked_cast.h20760644editdlrm
compare.h19810644editdlrm
compression.h73670644editdlrm
concurrent_map.h17750644editdlrm
config.h16590644editdlrm
converter.h146570644editdlrm
counting_semaphore.h22510644editdlrm
cpu_info.h47240644editdlrm
decimal.h116870644editdlrm
delimiting.h73350644editdlrm
dispatch.h32350644editdlrm
double_conversion.h11950644editdlrm
endian.h80710644editdlrm
formatting.h206120644editdlrm
functional.h56120644editdlrm
future.h361680644editdlrm
future_iterator.h25170644editdlrm
hashing.h306330644editdlrm
hash_util.h19140644editdlrm
int_util.h42840644editdlrm
io_util.h103260644editdlrm
iterator.h181230644editdlrm
key_value_metadata.h35790644editdlrm
launder.h10510644editdlrm
logging.h93380644editdlrm
macros.h73490644editdlrm
make_unique.h14750644editdlrm
map.h24760644editdlrm
math_constants.h11060644editdlrm
memory.h15660644editdlrm
mutex.h18330644editdlrm
optional.h11740644editdlrm
parallel.h36160644editdlrm
pcg_random.h11460644editdlrm
print.h17250644editdlrm
queue.h10170644editdlrm
range.h48340644editdlrm
rle_encoding.h310290644editdlrm
simd.h13330644editdlrm
small_vector.h146600644editdlrm
sort.h24660644editdlrm
spaced.h35670644editdlrm
stopwatch.h14010644editdlrm
string.h25700644editdlrm
string_builder.h24460644editdlrm
string_view.h12690644editdlrm
task_group.h43620644editdlrm
tdigest.h30520644editdlrm
test_common.h28370644editdlrm
thread_pool.h153380644editdlrm
time.h29880644editdlrm
trie.h71570644editdlrm
type_fwd.h14090644editdlrm
type_traits.h28940644editdlrm
ubsan.h27770644editdlrm
unreachable.h9260644editdlrm
uri.h32970644editdlrm
utf8.h187800644editdlrm
value_parsing.h270560644editdlrm
variant.h137280644editdlrm
vector.h56650644editdlrm
visibility.h14630644editdlrm
windows_compatibility.h12600644editdlrm
windows_fixup.h13790644editdlrm
Edit: /usr/local/lib64/python3.6/site-packages/pyarrow/include/arrow/util/bit_block_counter.h (19141B)
// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. #pragma once #include #include #include #include #include "arrow/buffer.h" #include "arrow/status.h" #include "arrow/util/bit_util.h" #include "arrow/util/endian.h" #include "arrow/util/macros.h" #include "arrow/util/ubsan.h" #include "arrow/util/visibility.h" namespace arrow { namespace internal { namespace detail { inline uint64_t LoadWord(const uint8_t* bytes) { return BitUtil::ToLittleEndian(util::SafeLoadAs(bytes)); } inline uint64_t ShiftWord(uint64_t current, uint64_t next, int64_t shift) { if (shift == 0) { return current; } return (current >> shift) | (next << (64 - shift)); } // These templates are here to help with unit tests template struct BitBlockAnd { static T Call(T left, T right) { return left & right; } }; template <> struct BitBlockAnd { static bool Call(bool left, bool right) { return left && right; } }; template struct BitBlockAndNot { static T Call(T left, T right) { return left & ~right; } }; template <> struct BitBlockAndNot { static bool Call(bool left, bool right) { return left && !right; } }; template struct BitBlockOr { static T Call(T left, T right) { return left | right; } }; template <> struct BitBlockOr { static bool Call(bool left, bool right) { return left || right; } }; template struct BitBlockOrNot { static T Call(T left, T right) { return left | ~right; } }; template <> struct BitBlockOrNot { static bool Call(bool left, bool right) { return left || !right; } }; } // namespace detail /// \brief Return value from bit block counters: the total number of bits and /// the number of set bits. struct BitBlockCount { int16_t length; int16_t popcount; bool NoneSet() const { return this->popcount == 0; } bool AllSet() const { return this->length == this->popcount; } }; /// \brief A class that scans through a true/false bitmap to compute popcounts /// 64 or 256 bits at a time. This is used to accelerate processing of /// mostly-not-null array data. class ARROW_EXPORT BitBlockCounter { public: BitBlockCounter(const uint8_t* bitmap, int64_t start_offset, int64_t length) : bitmap_(util::MakeNonNull(bitmap) + start_offset / 8), bits_remaining_(length), offset_(start_offset % 8) {} /// \brief The bit size of each word run static constexpr int64_t kWordBits = 64; /// \brief The bit size of four words run static constexpr int64_t kFourWordsBits = kWordBits * 4; /// \brief Return the next run of available bits, usually 256. The returned /// pair contains the size of run and the number of true values. The last /// block will have a length less than 256 if the bitmap length is not a /// multiple of 256, and will return 0-length blocks in subsequent /// invocations. BitBlockCount NextFourWords() { using detail::LoadWord; using detail::ShiftWord; if (!bits_remaining_) { return {0, 0}; } int64_t total_popcount = 0; if (offset_ == 0) { if (bits_remaining_ < kFourWordsBits) { return GetBlockSlow(kFourWordsBits); } total_popcount += BitUtil::PopCount(LoadWord(bitmap_)); total_popcount += BitUtil::PopCount(LoadWord(bitmap_ + 8)); total_popcount += BitUtil::PopCount(LoadWord(bitmap_ + 16)); total_popcount += BitUtil::PopCount(LoadWord(bitmap_ + 24)); } else { // When the offset is > 0, we need there to be a word beyond the last // aligned word in the bitmap for the bit shifting logic. if (bits_remaining_ < 5 * kFourWordsBits - offset_) { return GetBlockSlow(kFourWordsBits); } auto current = LoadWord(bitmap_); auto next = LoadWord(bitmap_ + 8); total_popcount += BitUtil::PopCount(ShiftWord(current, next, offset_)); current = next; next = LoadWord(bitmap_ + 16); total_popcount += BitUtil::PopCount(ShiftWord(current, next, offset_)); current = next; next = LoadWord(bitmap_ + 24); total_popcount += BitUtil::PopCount(ShiftWord(current, next, offset_)); current = next; next = LoadWord(bitmap_ + 32); total_popcount += BitUtil::PopCount(ShiftWord(current, next, offset_)); } bitmap_ += BitUtil::BytesForBits(kFourWordsBits); bits_remaining_ -= kFourWordsBits; return {256, static_cast(total_popcount)}; } /// \brief Return the next run of available bits, usually 64. The returned /// pair contains the size of run and the number of true values. The last /// block will have a length less than 64 if the bitmap length is not a /// multiple of 64, and will return 0-length blocks in subsequent /// invocations. BitBlockCount NextWord() { using detail::LoadWord; using detail::ShiftWord; if (!bits_remaining_) { return {0, 0}; } int64_t popcount = 0; if (offset_ == 0) { if (bits_remaining_ < kWordBits) { return GetBlockSlow(kWordBits); } popcount = BitUtil::PopCount(LoadWord(bitmap_)); } else { // When the offset is > 0, we need there to be a word beyond the last // aligned word in the bitmap for the bit shifting logic. if (bits_remaining_ < 2 * kWordBits - offset_) { return GetBlockSlow(kWordBits); } popcount = BitUtil::PopCount(ShiftWord(LoadWord(bitmap_), LoadWord(bitmap_ + 8), offset_)); } bitmap_ += kWordBits / 8; bits_remaining_ -= kWordBits; return {64, static_cast(popcount)}; } private: /// \brief Return block with the requested size when doing word-wise /// computation is not possible due to inadequate bits remaining. BitBlockCount GetBlockSlow(int64_t block_size) noexcept; const uint8_t* bitmap_; int64_t bits_remaining_; int64_t offset_; }; /// \brief A tool to iterate through a possibly non-existent validity bitmap, /// to allow us to write one code path for both the with-nulls and no-nulls /// cases without giving up a lot of performance. class ARROW_EXPORT OptionalBitBlockCounter { public: // validity_bitmap may be NULLPTR OptionalBitBlockCounter(const uint8_t* validity_bitmap, int64_t offset, int64_t length); // validity_bitmap may be null OptionalBitBlockCounter(const std::shared_ptr& validity_bitmap, int64_t offset, int64_t length); /// Return block count for next word when the bitmap is available otherwise /// return a block with length up to INT16_MAX when there is no validity /// bitmap (so all the referenced values are not null). BitBlockCount NextBlock() { static constexpr int64_t kMaxBlockSize = std::numeric_limits::max(); if (has_bitmap_) { BitBlockCount block = counter_.NextWord(); position_ += block.length; return block; } else { int16_t block_size = static_cast(std::min(kMaxBlockSize, length_ - position_)); position_ += block_size; // All values are non-null return {block_size, block_size}; } } // Like NextBlock, but returns a word-sized block even when there is no // validity bitmap BitBlockCount NextWord() { static constexpr int64_t kWordSize = 64; if (has_bitmap_) { BitBlockCount block = counter_.NextWord(); position_ += block.length; return block; } else { int16_t block_size = static_cast(std::min(kWordSize, length_ - position_)); position_ += block_size; // All values are non-null return {block_size, block_size}; } } private: const bool has_bitmap_; int64_t position_; int64_t length_; BitBlockCounter counter_; }; /// \brief A class that computes popcounts on the result of bitwise operations /// between two bitmaps, 64 bits at a time. A 64-bit word is loaded from each /// bitmap, then the popcount is computed on e.g. the bitwise-and of the two /// words. class ARROW_EXPORT BinaryBitBlockCounter { public: BinaryBitBlockCounter(const uint8_t* left_bitmap, int64_t left_offset, const uint8_t* right_bitmap, int64_t right_offset, int64_t length) : left_bitmap_(util::MakeNonNull(left_bitmap) + left_offset / 8), left_offset_(left_offset % 8), right_bitmap_(util::MakeNonNull(right_bitmap) + right_offset / 8), right_offset_(right_offset % 8), bits_remaining_(length) {} /// \brief Return the popcount of the bitwise-and of the next run of /// available bits, up to 64. The returned pair contains the size of run and /// the number of true values. The last block will have a length less than 64 /// if the bitmap length is not a multiple of 64, and will return 0-length /// blocks in subsequent invocations. BitBlockCount NextAndWord() { return NextWord(); } /// \brief Computes "x & ~y" block for each available run of bits. BitBlockCount NextAndNotWord() { return NextWord(); } /// \brief Computes "x | y" block for each available run of bits. BitBlockCount NextOrWord() { return NextWord(); } /// \brief Computes "x | ~y" block for each available run of bits. BitBlockCount NextOrNotWord() { return NextWord(); } private: template