| 96 | |
| 97 | template <typename T, bool use_selection> |
| 98 | void SwissTable::extract_group_ids_imp(const int num_keys, const uint16_t* selection, |
| 99 | const uint32_t* hashes, const uint8_t* local_slots, |
| 100 | uint32_t* out_group_ids) const { |
| 101 | if (log_blocks_ == 0) { |
| 102 | DCHECK_EQ(sizeof(T), sizeof(uint8_t)); |
| 103 | for (int i = 0; i < num_keys; ++i) { |
| 104 | uint32_t id = use_selection ? selection[i] : i; |
| 105 | uint32_t group_id = |
| 106 | block_data(/*block_id=*/0, |
| 107 | /*num_block_bytes=*/0)[bytes_status_in_block_ + local_slots[id]]; |
| 108 | out_group_ids[id] = group_id; |
| 109 | } |
| 110 | } else { |
| 111 | int num_groupid_bits = num_groupid_bits_from_log_blocks(log_blocks_); |
| 112 | DCHECK_EQ(sizeof(T) * 8, num_groupid_bits); |
| 113 | int num_block_bytes = num_block_bytes_from_num_groupid_bits(num_groupid_bits); |
| 114 | |
| 115 | for (int i = 0; i < num_keys; ++i) { |
| 116 | uint32_t id = use_selection ? selection[i] : i; |
| 117 | uint32_t hash = hashes[id]; |
| 118 | uint32_t block_id = block_id_from_hash(hash, log_blocks_); |
| 119 | const T* slots_base = reinterpret_cast<const T*>( |
| 120 | block_data(block_id, num_block_bytes) + bytes_status_in_block_); |
| 121 | uint32_t group_id = static_cast<uint32_t>(slots_base[local_slots[id]]); |
| 122 | out_group_ids[id] = group_id; |
| 123 | } |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | void SwissTable::extract_group_ids(const int num_keys, const uint16_t* optional_selection, |
| 128 | const uint32_t* hashes, const uint8_t* local_slots, |
nothing calls this directly
no test coverage detected