summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-02-25 16:29:08 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-02-25 16:29:08 +0000
commit830902094e2c13e5e2b511266cd41c905898feda (patch)
tree227f2519c97927a3d169a113bbf5070c5ee95ca6
parent0cd172e2126c52774ad60310a6dd1441b4752891 (diff)
Add method the considers elemsize when computing number of elements that will maximize 2^N bytes block
-rw-r--r--vespalib/src/tests/alloc/alloc_test.cpp15
-rw-r--r--vespalib/src/vespa/vespalib/util/alloc.h6
2 files changed, 21 insertions, 0 deletions
diff --git a/vespalib/src/tests/alloc/alloc_test.cpp b/vespalib/src/tests/alloc/alloc_test.cpp
index c52170fc8ec..d37abb15c2f 100644
--- a/vespalib/src/tests/alloc/alloc_test.cpp
+++ b/vespalib/src/tests/alloc/alloc_test.cpp
@@ -47,6 +47,21 @@ TEST("test roundUp2inN") {
EXPECT_EQUAL(16u, roundUp2inN(9));
}
+TEST("test roundUp2inN elems") {
+ EXPECT_EQUAL(0u, roundUp2inN(0, 17));
+ EXPECT_EQUAL(1u, roundUp2inN(1, 17));
+ EXPECT_EQUAL(3u, roundUp2inN(2, 17));
+ EXPECT_EQUAL(3u, roundUp2inN(3, 17));
+ EXPECT_EQUAL(7u, roundUp2inN(4, 17));
+ EXPECT_EQUAL(7u, roundUp2inN(5, 17));
+ EXPECT_EQUAL(7u, roundUp2inN(6, 17));
+ EXPECT_EQUAL(7u, roundUp2inN(7, 17));
+ EXPECT_EQUAL(15u, roundUp2inN(8, 17));
+ EXPECT_EQUAL(15u, roundUp2inN(9, 17));
+ EXPECT_EQUAL(15u, roundUp2inN(15, 17));
+ EXPECT_EQUAL(30u, roundUp2inN(16, 17));
+}
+
TEST("test basics") {
{
Alloc h = Alloc::allocHeap(100);
diff --git a/vespalib/src/vespa/vespalib/util/alloc.h b/vespalib/src/vespa/vespalib/util/alloc.h
index 71a3bd2407a..a1bb6af6514 100644
--- a/vespalib/src/vespa/vespalib/util/alloc.h
+++ b/vespalib/src/vespa/vespalib/util/alloc.h
@@ -80,8 +80,14 @@ private:
namespace vespalib {
+/// Rounds up to the closest number that is a power of 2
inline size_t roundUp2inN(size_t minimum) {
return 2ul << Optimized::msbIdx(minimum - 1);
}
+/// Rounds minElems up to the closest number where minElems*elemSize is a power of 2
+inline size_t roundUp2inN(size_t minElems, size_t elemSize) {
+ return roundUp2inN(minElems * elemSize)/elemSize;
+}
+
}