summaryrefslogtreecommitdiffstats
path: root/eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h
diff options
context:
space:
mode:
Diffstat (limited to 'eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h')
-rw-r--r--eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h b/eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h
new file mode 100644
index 00000000000..770ea4ae5ea
--- /dev/null
+++ b/eval/src/vespa/eval/tensor/dense/typed_dense_tensor_builder.h
@@ -0,0 +1,41 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "dense_tensor.h"
+
+namespace vespalib::tensor {
+
+/**
+ * Class for building a dense tensor by inserting cell values directly into underlying array of cells.
+ */
+template <typename CT>
+class TypedDenseTensorBuilder
+{
+public:
+ using Address = DenseTensorView::Address;
+private:
+ eval::ValueType _type;
+ std::vector<CT> _cells;
+
+ static size_t calculateCellAddress(const Address &address, const eval::ValueType &type) {
+ size_t result = 0;
+ for (size_t i = 0; i < address.size(); ++i) {
+ result *= type.dimensions()[i].size;
+ result += address[i];
+ }
+ return result;
+ }
+public:
+ TypedDenseTensorBuilder(const eval::ValueType &type_in);
+ ~TypedDenseTensorBuilder();
+ void insertCell(const Address &address, CT cellValue) {
+ insertCell(calculateCellAddress(address, _type), cellValue);
+ }
+ void insertCell(size_t index, CT cellValue) {
+ _cells[index] = cellValue;
+ }
+ Tensor::UP build();
+};
+
+}