summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2020-10-23 13:18:04 +0000
committerHåvard Pettersen <havardpe@oath.com>2020-10-26 12:26:31 +0000
commita3a5da626502b625b1b13eff983fa58f44a5389d (patch)
tree6caf903e5520f054d9e0b9d445ce6a7329c4464f /vespalib
parent6e23dcf00c5307a157881be88548363d21c58b38 (diff)
add function to allocate an uninitialized array
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/stash/stash.cpp21
-rw-r--r--vespalib/src/vespa/vespalib/util/stash.h6
2 files changed, 27 insertions, 0 deletions
diff --git a/vespalib/src/tests/stash/stash.cpp b/vespalib/src/tests/stash/stash.cpp
index deb4f862dbe..cea359a1bab 100644
--- a/vespalib/src/tests/stash/stash.cpp
+++ b/vespalib/src/tests/stash/stash.cpp
@@ -449,4 +449,25 @@ TEST("require that mark/revert works as expected") {
EXPECT_EQUAL(stash.count_used(), 0u);
}
+void check_array(ArrayRef<float> arr, size_t expect_size) {
+ EXPECT_EQUAL(arr.size(), expect_size);
+ for (size_t i = 0; i < arr.size(); ++i) {
+ arr[i] = float(i);
+ }
+ for (size_t i = 0; i < arr.size(); ++i) {
+ EXPECT_EQUAL(arr[i], float(i));
+ }
+}
+
+TEST("require that uninitialized arrays can be created") {
+ Stash stash(4096);
+ EXPECT_EQUAL(0u, stash.count_used());
+ ArrayRef<float> small_arr = stash.create_uninitialized_array<float>(64);
+ TEST_DO(check_array(small_arr, 64));
+ EXPECT_EQUAL(sum({chunk_header_size(), sizeof(float) * 64}), stash.count_used());
+ ArrayRef<float> big_arr = stash.create_uninitialized_array<float>(2500);
+ TEST_DO(check_array(big_arr, 2500));
+ EXPECT_EQUAL(sum({chunk_header_size(), sizeof(float) * 64}), stash.count_used());
+}
+
TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vespalib/src/vespa/vespalib/util/stash.h b/vespalib/src/vespa/vespalib/util/stash.h
index 48ac16080c0..c9a66c1a53f 100644
--- a/vespalib/src/vespa/vespalib/util/stash.h
+++ b/vespalib/src/vespa/vespalib/util/stash.h
@@ -175,6 +175,12 @@ public:
}
template <typename T>
+ ArrayRef<T> create_uninitialized_array(size_t size) {
+ static_assert(can_skip_destruction<T>::value);
+ return ArrayRef<T>(reinterpret_cast<T*>(alloc(size * sizeof(T))), size);
+ }
+
+ template <typename T>
ArrayRef<T> copy_array(ConstArrayRef<T> src) {
if (can_skip_destruction<T>::value) {
return ArrayRef<T>(copy_elements<T>(alloc(src.size() * sizeof(T)), src), src.size());