From e7489b70d16d218470cb5ce45766bdfa38d6db91 Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Tue, 28 Feb 2023 21:46:11 +0100 Subject: enhance: Add util::likely_size_on_disk --- src/util/file.hpp | 13 ++++++++++++- unittest/test_util_file.cpp | 11 ++++++++++- 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 read_fd(int fd, DataReceiver data_receiver); @@ -87,4 +90,12 @@ nonstd::expected write_file(const std::string& path, nonstd::span 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; -- cgit v1.2.1