]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
refactor: Simplify Statistics::format_machine_readable slightly
authorJoel Rosdahl <joel@rosdahl.net>
Sat, 3 Feb 2024 09:42:29 +0000 (10:42 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 3 Feb 2024 09:42:29 +0000 (10:42 +0100)
src/core/Statistic.hpp
src/core/Statistics.cpp
src/core/Statistics.hpp
src/core/mainoptions.cpp

index 26926fc028c636f9bc9f93fa33512df1ea5990c1..55c30acc5677099717b20ea3cd1fe3a454ea7337 100644 (file)
@@ -84,7 +84,7 @@ enum class Statistic {
   END = 84
 };
 
-enum class StatisticFormat {
+enum class StatisticsFormat {
   Tab,
   Json,
 };
index 3ae77ae4e075235764113b1127746e1533010af9..2e0d5e35e6fe54647e8422a51131f76e91cc351e 100644 (file)
@@ -523,69 +523,52 @@ Statistics::format_human_readable(const Config& config,
   return table.render();
 }
 
-std::string
-Statistics::format_machine_readable(const Config& config,
-                                    const util::TimePoint& last_updated,
-                                    const StatisticFormat format) const
-{
-  switch (format) {
-  case StatisticFormat::Json:
-    return Statistics::format_json(config, last_updated);
-  case StatisticFormat::Tab:
-    /* fall through */
-  default:
-    return Statistics::format_tab_separated(config, last_updated);
-  }
-}
-
-std::string
-Statistics::format_tab_separated(const Config& config,
-                                 const util::TimePoint& last_updated) const
+std::vector<std::pair<std::string, uint64_t>>
+Statistics::prepare_statistics_entries(
+  const Config& config, const util::TimePoint& last_updated) const
 {
-  std::vector<std::string> lines;
-
-  lines.push_back(FMT("stats_updated_timestamp\t{}\n", last_updated.sec()));
-
-  auto add_line = [&](auto id, auto value) {
-    lines.push_back(FMT("{}\t{}\n", id, value));
-  };
+  std::vector<std::pair<std::string, uint64_t>> result;
 
   for (const auto& field : k_statistics_fields) {
     if (!(field.flags & FLAG_NEVER)) {
-      add_line(field.id, m_counters.get(field.statistic));
+      result.emplace_back(field.id, m_counters.get(field.statistic));
     }
   }
 
-  add_line("max_cache_size_kibibyte", config.max_size() / 1024);
-  add_line("max_files_in_cache", config.max_files());
+  result.emplace_back("max_cache_size_kibibyte", config.max_size() / 1024);
+  result.emplace_back("max_files_in_cache", config.max_files());
+  result.emplace_back("stats_updated_timestamp", last_updated.sec());
 
-  std::sort(lines.begin(), lines.end());
-  return util::join(lines, "");
+  std::sort(result.begin(), result.end());
+  return result;
 }
 
 std::string
-Statistics::format_json(const Config& config,
-                        const util::TimePoint& last_updated) const
+Statistics::format_machine_readable(const Config& config,
+                                    const util::TimePoint& last_updated,
+                                    StatisticsFormat format) const
 {
-  std::vector<std::string> lines;
-
-  auto add_line = [&](auto id, auto value) {
-    lines.push_back(FMT("\"{}\": {}", id, value));
-  };
+  std::string result;
+  const auto fields = prepare_statistics_entries(config, last_updated);
 
-  add_line("stats_updated_timestamp", last_updated.sec());
-
-  for (const auto& field : k_statistics_fields) {
-    if (!(field.flags & FLAG_NEVER)) {
-      add_line(field.id, m_counters.get(field.statistic));
+  switch (format) {
+  case StatisticsFormat::Json:
+    result = "{";
+    for (const auto& [id, value] : fields) {
+      result.append(FMT("\n  \"{}\": {},", id, value));
     }
+    result.resize(result.length() - 1); // Remove trailing comma
+    result += "\n}\n";
+    break;
+  case StatisticsFormat::Tab:
+    for (const auto& [id, value] : fields) {
+      result += FMT("{}\t{}\n", id, value);
+    }
+    break;
+  default:
+    ASSERT(false);
   }
 
-  add_line("max_cache_size_kibibyte", config.max_size() / 1024);
-  add_line("max_files_in_cache", config.max_files());
-
-  std::sort(lines.begin(), lines.end());
-  std::string result = "{\n  " + util::join(lines, ",\n  ") + "\n}\n";
   return result;
 }
 
index f0951ed2857bbaa14e311f64d4361ed7a8197cb8..ab0a1f18447526623d9d7498e4ddc48b97469cbf 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2023 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2024 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
@@ -25,6 +25,7 @@
 #include <ctime>
 #include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 class Config;
@@ -48,7 +49,7 @@ public:
   // Format cache statistics in machine-readable format.
   std::string format_machine_readable(const Config& config,
                                       const util::TimePoint& last_updated,
-                                      const StatisticFormat format) const;
+                                      StatisticsFormat format) const;
 
   const StatisticsCounters& counters() const;
 
@@ -62,12 +63,9 @@ private:
   uint64_t count_stats(unsigned flags) const;
   std::vector<std::pair<std::string, uint64_t>> get_stats(unsigned flags,
                                                           bool all) const;
-  // Format cache statistics in tab-separated format.
-  std::string format_tab_separated(const Config& config,
-                                   const util::TimePoint& last_updated) const;
-  // Format cache statistics in JSON format.
-  std::string format_json(const Config& config,
-                          const util::TimePoint& last_updated) const;
+  std::vector<std::pair<std::string, uint64_t>>
+  prepare_statistics_entries(const Config& config,
+                             const util::TimePoint& last_updated) const;
 };
 
 // --- Inline implementations ---
index 9ad83588c553a30721525386de6fdea8c85a31fb..acdcece47438a54df5ecfcf26f03060fb4f4d1d3 100644 (file)
@@ -500,7 +500,7 @@ process_main_options(int argc, const char* const* argv)
 
   uint8_t verbosity = 0;
 
-  StatisticFormat format = StatisticFormat::Tab;
+  StatisticsFormat format = StatisticsFormat::Tab;
   std::optional<uint64_t> trim_max_size;
   std::optional<util::SizeUnitPrefixType> trim_suffix_type;
   bool trim_lru_mtime = false;
@@ -527,9 +527,9 @@ process_main_options(int argc, const char* const* argv)
       break;
     case FORMAT:
       if (arg == "tab") {
-        format = StatisticFormat::Tab;
+        format = StatisticsFormat::Tab;
       } else if (arg == "json") {
-        format = StatisticFormat::Json;
+        format = StatisticsFormat::Json;
       } else {
         PRINT(stderr, "Error: unknown format \"{}\"\n", arg);
         return EXIT_FAILURE;