diff options
author | Arne Juul <arnej@verizonmedia.com> | 2020-11-04 10:17:05 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2020-11-04 10:17:05 +0000 |
commit | c00c16f4bc82275d32657f7ca40ead26050b6245 (patch) | |
tree | b578ba7d2638e37f6d4c1df9b664513b31e25e5a /eval | |
parent | 9856a29b4685a0119c5f73ba93e5fd6bb16d13ea (diff) |
just loop over subspaces
Diffstat (limited to 'eval')
-rw-r--r-- | eval/src/vespa/eval/eval/fast_value.hpp | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/eval/src/vespa/eval/eval/fast_value.hpp b/eval/src/vespa/eval/eval/fast_value.hpp index 2f0c9b6f6a8..559f2e0a7f6 100644 --- a/eval/src/vespa/eval/eval/fast_value.hpp +++ b/eval/src/vespa/eval/eval/fast_value.hpp @@ -377,38 +377,34 @@ FastValueIndex::sparse_no_overlap_join(const ValueType &res_type, const Fun &fun using HashedLabelRef = std::reference_wrapper<const FastSparseMap::HashedLabel>; auto &result = stash.create<FastValue<OCT>>(res_type, res_type.count_mapped_dimensions(), 1, lhs.map.size()*rhs.map.size()); std::vector<HashedLabelRef> output_addr; - lhs.map.each_map_entry([&](auto lhs_subspace, auto) - { - auto l_addr = lhs.map.make_addr(lhs_subspace); - rhs.map.each_map_entry([&](auto rhs_subspace, auto) - { - auto r_addr = rhs.map.make_addr(rhs_subspace); - output_addr.clear(); - size_t l_idx = 0; - size_t r_idx = 0; - for (JoinAddrSource source : addr_sources) { - switch (source) { - case JoinAddrSource::LHS: - output_addr.push_back(l_addr[l_idx++]); - break; - case JoinAddrSource::RHS: - output_addr.push_back(r_addr[r_idx++]); - break; - default: - abort(); - } - } - assert(l_idx == l_addr.size()); - assert(r_idx == r_addr.size()); - - ConstArrayRef<HashedLabelRef> output_addr_ref(output_addr); - auto idx = result.my_index.map.add_mapping(output_addr_ref); - if (__builtin_expect((idx == result.my_cells.size), true)) { - auto cell_value = fun(lhs_cells[lhs_subspace], rhs_cells[rhs_subspace]); - result.my_cells.push_back_fast(cell_value); - } - }); - }); + for (size_t lhs_subspace = 0; lhs_subspace < lhs.map.size(); ++lhs_subspace) { + auto l_addr = lhs.map.make_addr(lhs_subspace); + for (size_t rhs_subspace = 0; rhs_subspace < rhs.map.size(); ++rhs_subspace) { + auto r_addr = rhs.map.make_addr(rhs_subspace); + output_addr.clear(); + size_t l_idx = 0; + size_t r_idx = 0; + for (JoinAddrSource source : addr_sources) { + switch (source) { + case JoinAddrSource::LHS: + output_addr.push_back(l_addr[l_idx++]); + break; + case JoinAddrSource::RHS: + output_addr.push_back(r_addr[r_idx++]); + break; + default: + abort(); + } + } + assert(l_idx == l_addr.size()); + assert(r_idx == r_addr.size()); + auto idx = result.my_index.map.add_mapping(ConstArrayRef(output_addr)); + if (__builtin_expect((idx == result.my_cells.size), true)) { + auto cell_value = fun(lhs_cells[lhs_subspace], rhs_cells[rhs_subspace]); + result.my_cells.push_back_fast(cell_value); + } + } + } return result; } |