]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
enhance: Add Util::format_human_readable_diff
authorJoel Rosdahl <joel@rosdahl.net>
Mon, 14 Nov 2022 08:55:09 +0000 (09:55 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 27 Nov 2022 20:33:50 +0000 (21:33 +0100)
src/Util.cpp
src/Util.hpp
unittest/test_Util.cpp

index 3aecbaa1ef8a4c600718d92b1169ecac693c84ee..844e5497a14171391f95e57124e17425215a38f0 100644 (file)
@@ -555,6 +555,13 @@ format_base32hex(const uint8_t* data, size_t size)
   return result;
 }
 
+std::string
+format_human_readable_diff(int64_t diff)
+{
+  const char* sign = diff == 0 ? "" : (diff > 0 ? "+" : "-");
+  return FMT("{}{}", sign, format_human_readable_size(std::abs(diff)));
+}
+
 std::string
 format_human_readable_size(uint64_t size)
 {
index e29aff3d4308c9f37fd190e5a8f55600892d009e..1bd57b0df640d92640ec93697bd54d7c524ac1c0 100644 (file)
@@ -143,6 +143,9 @@ std::string format_base16(const uint8_t* data, size_t size);
 // padding characters will be added.
 std::string format_base32hex(const uint8_t* data, size_t size);
 
+// Format `diff` as a human-readable string.
+std::string format_human_readable_diff(int64_t diff);
+
 // Format `size` as a human-readable string.
 std::string format_human_readable_size(uint64_t size);
 
index 8cb331b4a9b8300aa80f7609ce2f2f6a97f785be..a45d7c57abd5f1ac4cffd5785bc0144edd384e03 100644 (file)
@@ -256,6 +256,34 @@ TEST_CASE("Util::format_base32hex")
   CHECK(Util::format_base32hex(input, 6) == "cpnmuoj1e8");
 }
 
+TEST_CASE("Util::format_human_readable_diff")
+{
+  CHECK(Util::format_human_readable_diff(0) == "0 bytes");
+  CHECK(Util::format_human_readable_diff(1) == "+1 byte");
+  CHECK(Util::format_human_readable_diff(42) == "+42 bytes");
+  CHECK(Util::format_human_readable_diff(1949) == "+1.9 kB");
+  CHECK(Util::format_human_readable_diff(1951) == "+2.0 kB");
+  CHECK(Util::format_human_readable_diff(499.7 * 1000) == "+499.7 kB");
+  CHECK(Util::format_human_readable_diff(1000 * 1000) == "+1.0 MB");
+  CHECK(Util::format_human_readable_diff(1234 * 1000) == "+1.2 MB");
+  CHECK(Util::format_human_readable_diff(438.5 * 1000 * 1000) == "+438.5 MB");
+  CHECK(Util::format_human_readable_diff(1000 * 1000 * 1000) == "+1.0 GB");
+  CHECK(Util::format_human_readable_diff(17.11 * 1000 * 1000 * 1000)
+        == "+17.1 GB");
+
+  CHECK(Util::format_human_readable_diff(-1) == "-1 byte");
+  CHECK(Util::format_human_readable_diff(-42) == "-42 bytes");
+  CHECK(Util::format_human_readable_diff(-1949) == "-1.9 kB");
+  CHECK(Util::format_human_readable_diff(-1951) == "-2.0 kB");
+  CHECK(Util::format_human_readable_diff(-499.7 * 1000) == "-499.7 kB");
+  CHECK(Util::format_human_readable_diff(-1000 * 1000) == "-1.0 MB");
+  CHECK(Util::format_human_readable_diff(-1234 * 1000) == "-1.2 MB");
+  CHECK(Util::format_human_readable_diff(-438.5 * 1000 * 1000) == "-438.5 MB");
+  CHECK(Util::format_human_readable_diff(-1000 * 1000 * 1000) == "-1.0 GB");
+  CHECK(Util::format_human_readable_diff(-17.11 * 1000 * 1000 * 1000)
+        == "-17.1 GB");
+}
+
 TEST_CASE("Util::format_human_readable_size")
 {
   CHECK(Util::format_human_readable_size(0) == "0 bytes");