summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-01-11 15:34:22 +0000
committerArne Juul <arnej@verizonmedia.com>2021-01-11 16:10:32 +0000
commit61fcd38ea21f1877b4e1630179decb6df909a240 (patch)
treea2198b69aa26c88cfdbc735405005298b385d383 /eval
parentb8e785bc4df2af25e317e19b23d9f12c83dbdf6e (diff)
make a value copy using the API
Diffstat (limited to 'eval')
-rw-r--r--eval/src/vespa/eval/eval/value.cpp48
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