summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-03-07 12:33:13 +0100
committerTor Egge <Tor.Egge@online.no>2023-03-07 12:33:13 +0100
commite78d41ca393820e5b611b78dfc8323399f7a7306 (patch)
treef952f3d976f58fa1c9900c5ad3feead2f4aabc98 /vespalib
parent9216fc51033030d503888d7419fd5525f92a02eb (diff)
Move portions of TensorBufferTypeMapper to ArrayStoreTypeMapper.
Diffstat (limited to 'vespalib')
-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
3 files changed, 73 insertions, 0 deletions
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;
+};
+
+}