summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Rosdahl <joel@rosdahl.net>2023-02-28 21:46:11 +0100
committerJoel Rosdahl <joel@rosdahl.net>2023-03-04 10:10:20 +0100
commite7489b70d16d218470cb5ce45766bdfa38d6db91 (patch)
tree9209f9fd37bff232b2c5f3918fa0b7fb8136e65d
parent9b7830450268893bdb23872d5fcfa89b8d014f5e (diff)
downloadccache-e7489b70d16d218470cb5ce45766bdfa38d6db91.tar.gz
enhance: Add util::likely_size_on_disk
-rw-r--r--src/util/file.hpp13
-rw-r--r--unittest/test_util_file.cpp11
2 files changed, 22 insertions, 2 deletions
diff --git a/src/util/file.hpp b/src/util/file.hpp
index bb0c8b22..c74b58dc 100644
--- a/src/util/file.hpp
+++ b/src/util/file.hpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2021-2022 Joel Rosdahl and other contributors
+// Copyright (C) 2021-2023 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
@@ -39,6 +39,9 @@ enum class InPlace { yes, no };
void create_cachedir_tag(const std::string& dir);
+// Return how much a file of `size` bytes likely would take on disk.
+uint64_t likely_size_on_disk(uint64_t size);
+
// Read data from `fd` until end of file and call `data_receiver` with the read
// data. Returns an error if the underlying read(2) call returned -1.
nonstd::expected<void, std::string> read_fd(int fd, DataReceiver data_receiver);
@@ -87,4 +90,12 @@ nonstd::expected<void, std::string> write_file(const std::string& path,
nonstd::span<const uint8_t> data,
InPlace in_place = InPlace::no);
+// --- Inline implementations ---
+
+inline uint64_t
+likely_size_on_disk(uint64_t size)
+{
+ return (size + 4095) & ~4095;
+}
+
} // namespace util
diff --git a/unittest/test_util_file.cpp b/unittest/test_util_file.cpp
index b1222b43..3cf09281 100644
--- a/unittest/test_util_file.cpp
+++ b/unittest/test_util_file.cpp
@@ -1,4 +1,4 @@
-// Copyright (C) 2022 Joel Rosdahl and other contributors
+// Copyright (C) 2022-2023 Joel Rosdahl and other contributors
//
// See doc/AUTHORS.adoc for a complete list of contributors.
//
@@ -29,6 +29,15 @@
using TestUtil::TestContext;
+TEST_CASE("util::likely_size_on_disk")
+{
+ CHECK(util::likely_size_on_disk(0) == 0);
+ CHECK(util::likely_size_on_disk(1) == 4096);
+ CHECK(util::likely_size_on_disk(4095) == 4096);
+ CHECK(util::likely_size_on_disk(4096) == 4096);
+ CHECK(util::likely_size_on_disk(4097) == 8192);
+}
+
TEST_CASE("util::read_file and util::write_file, text data")
{
TestContext test_context;