diff options
author | Arne Juul <arnej@verizonmedia.com> | 2021-01-11 15:34:22 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2021-01-11 16:10:32 +0000 |
commit | 61fcd38ea21f1877b4e1630179decb6df909a240 (patch) | |
tree | a2198b69aa26c88cfdbc735405005298b385d383 /eval | |
parent | b8e785bc4df2af25e317e19b23d9f12c83dbdf6e (diff) |
make a value copy using the API
Diffstat (limited to 'eval')
-rw-r--r-- | eval/src/vespa/eval/eval/value.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/eval/src/vespa/eval/eval/value.cpp b/eval/src/vespa/eval/eval/value.cpp index 7dcd04c8ab2..bfa77d1a604 100644 --- a/eval/src/vespa/eval/eval/value.cpp +++ b/eval/src/vespa/eval/eval/value.cpp @@ -64,12 +64,54 @@ ValueType ScalarValue<T>::_type = ValueType::make_type(get_cell_type<T>(), {}); template class ScalarValue<double>; template class ScalarValue<float>; +namespace { + +struct CopyValue { + template <typename CT> + static std::unique_ptr<Value> invoke(const Value &value, + const ValueType &type, + const ValueBuilderFactory &factory) + { + size_t num_mapped = type.count_mapped_dimensions(); + size_t dense_size = type.dense_subspace_size(); + const auto & idx = value.index(); + auto input_cells = value.cells().typify<CT>(); + auto builder = factory.create_value_builder<CT>(type, num_mapped, dense_size, idx.size()); + std::vector<string_id> addr(num_mapped); + if (num_mapped == 0) { + assert(idx.size() == 1); + auto array_ref = builder->add_subspace(addr); + for (size_t i = 0; i < dense_size; ++i) { + array_ref[i] = input_cells[i]; + } + } else { + auto view = idx.create_view({}); + view->lookup({}); + std::vector<string_id*> addr_fetch; + addr_fetch.reserve(num_mapped); + for (auto & label : addr) { + addr_fetch.push_back(&label); + } + size_t subspace_idx; + while (view->next_result(addr_fetch, subspace_idx)) { + auto array_ref = builder->add_subspace(addr); + for (size_t i = 0; i < dense_size; ++i) { + array_ref[i] = input_cells[(dense_size * subspace_idx) + i]; + } + } + } + return builder->build(std::move(builder)); + } +}; + +} // namespace <unnamed> + std::unique_ptr<Value> ValueBuilderFactory::copy(const Value &value) const { - nbostream stream; - encode_value(value, stream); - return decode_value(stream, *this); + const auto & type = value.type(); + return typify_invoke<1,TypifyCellType,CopyValue>(type.cell_type(), + value, type, *this); } } // namespace vespalib::eval |