From e78d41ca393820e5b611b78dfc8323399f7a7306 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Tue, 7 Mar 2023 12:33:13 +0100 Subject: Move portions of TensorBufferTypeMapper to ArrayStoreTypeMapper. --- .../src/vespa/vespalib/datastore/CMakeLists.txt | 1 + .../vespalib/datastore/array_store_type_mapper.cpp | 41 ++++++++++++++++++++++ .../vespalib/datastore/array_store_type_mapper.h | 31 ++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.cpp create mode 100644 vespalib/src/vespa/vespalib/datastore/array_store_type_mapper.h (limited to 'vespalib') 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 +#include + +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 +#include +#include + +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 _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; +}; + +} -- cgit v1.2.3