summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp29
-rw-r--r--searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h10
-rw-r--r--vespalib/src/vespa/vespalib/datastore/CMakeLists.txt1
-rw-r--r--vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp41
-rw-r--r--vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h31
5 files changed, 77 insertions, 35 deletions
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp
index ce8cc11026c..44f175be4e7 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.cpp
@@ -9,13 +9,13 @@
namespace search::tensor {
TensorBufferTypeMapper::TensorBufferTypeMapper()
- : _array_sizes(),
+ : ArrayStoreTypeMapper(),
_ops(nullptr)
{
}
TensorBufferTypeMapper::TensorBufferTypeMapper(uint32_t max_small_subspaces_type_id, double grow_factor, TensorBufferOperations* ops)
- : _array_sizes(),
+ : ArrayStoreTypeMapper(),
_ops(ops)
{
_array_sizes.reserve(max_small_subspaces_type_id + 1);
@@ -42,29 +42,4 @@ TensorBufferTypeMapper::TensorBufferTypeMapper(uint32_t max_small_subspaces_type
TensorBufferTypeMapper::~TensorBufferTypeMapper() = default;
-uint32_t
-TensorBufferTypeMapper::get_type_id(size_t array_size) const
-{
- assert(!_array_sizes.empty());
- auto result = std::lower_bound(_array_sizes.begin() + 1, _array_sizes.end(), array_size);
- if (result == _array_sizes.end()) {
- return 0; // type id 0 uses LargeSubspacesBufferType
- }
- return result - _array_sizes.begin();
-}
-
-size_t
-TensorBufferTypeMapper::get_array_size(uint32_t type_id) const
-{
- assert(type_id > 0 && type_id < _array_sizes.size());
- return _array_sizes[type_id];
-}
-
-uint32_t
-TensorBufferTypeMapper::get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept
-{
- auto clamp_type_id = _array_sizes.size() - 1;
- return (clamp_type_id < max_small_array_type_id) ? clamp_type_id : max_small_array_type_id;
-}
-
}
diff --git a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h
index ad2116a429c..422224751e3 100644
--- a/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h
+++ b/searchlib/src/vespa/searchlib/tensor/tensor_buffer_type_mapper.h
@@ -2,9 +2,7 @@
#pragma once
-#include <cstddef>
-#include <cstdint>
-#include <vector>
+#include <vespa/vespalib/datastore/array_store_type_mapper.h>
namespace search::tensor {
@@ -16,9 +14,8 @@ class TensorBufferOperations;
* This class provides mapping between type ids and array sizes needed for
* storing a tensor.
*/
-class TensorBufferTypeMapper
+class TensorBufferTypeMapper : public vespalib::datastore::ArrayStoreTypeMapper
{
- std::vector<size_t> _array_sizes;
TensorBufferOperations* _ops;
public:
using SmallBufferType = SmallSubspacesBufferType;
@@ -28,10 +25,7 @@ public:
TensorBufferTypeMapper(uint32_t max_small_subspaces_type_id, double grow_factor, TensorBufferOperations* ops);
~TensorBufferTypeMapper();
- uint32_t get_type_id(size_t array_size) const;
- size_t get_array_size(uint32_t type_id) const;
TensorBufferOperations& get_tensor_buffer_operations() const noexcept { return *_ops; }
- uint32_t get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept;
};
}
diff --git a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt
index f11004363f8..1c3b9112dda 100644
--- a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt
+++ b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt
@@ -3,6 +3,7 @@ vespa_add_library(vespalib_vespalib_datastore OBJECT
SOURCES
array_store.cpp
array_store_config.cpp
+ array_store_type_mapper.cpp
atomic_entry_ref.cpp
buffer_free_list.cpp
buffer_stats.cpp
diff --git a/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp
new file mode 100644
index 00000000000..ff514f5a00b
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp
@@ -0,0 +1,41 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "array_store_type_mapper.h"
+#include <algorithm>
+#include <cassert>
+
+namespace vespalib::datastore {
+
+ArrayStoreTypeMapper::ArrayStoreTypeMapper()
+ : _array_sizes()
+{
+}
+
+ArrayStoreTypeMapper::~ArrayStoreTypeMapper() = default;
+
+uint32_t
+ArrayStoreTypeMapper::get_type_id(size_t array_size) const
+{
+ assert(!_array_sizes.empty());
+ auto result = std::lower_bound(_array_sizes.begin() + 1, _array_sizes.end(), array_size);
+ if (result == _array_sizes.end()) {
+ return 0; // type id 0 uses buffer type for large arrays
+ }
+ return result - _array_sizes.begin();
+}
+
+size_t
+ArrayStoreTypeMapper::get_array_size(uint32_t type_id) const
+{
+ assert(type_id > 0 && type_id < _array_sizes.size());
+ return _array_sizes[type_id];
+}
+
+uint32_t
+ArrayStoreTypeMapper::get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept
+{
+ auto clamp_type_id = _array_sizes.size() - 1;
+ return (clamp_type_id < max_small_array_type_id) ? clamp_type_id : max_small_array_type_id;
+}
+
+}
diff --git a/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h
new file mode 100644
index 00000000000..e707627de19
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h
@@ -0,0 +1,31 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <cstddef>
+#include <cstdint>
+#include <vector>
+
+namespace vespalib::datastore {
+
+/*
+ * This class provides mapping between type ids and array sizes needed for
+ * storing a value with size smaller than or equal to the array size.
+ *
+ * The array sizes vector is a monotic increasing sequence that might end
+ * with exponential growth.
+ */
+class ArrayStoreTypeMapper
+{
+protected:
+ std::vector<size_t> _array_sizes;
+public:
+ ArrayStoreTypeMapper();
+ ~ArrayStoreTypeMapper();
+
+ uint32_t get_type_id(size_t array_size) const;
+ size_t get_array_size(uint32_t type_id) const;
+ uint32_t get_max_small_array_type_id(uint32_t max_small_array_type_id) const noexcept;
+};
+
+}