improve heatmap::add() by using C++23 ranges-v3

Sat, 01 Feb 2025 13:59:01 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 01 Feb 2025 13:59:01 +0100
changeset 10
bf159cf9f4b6
parent 9
98312f94dbdd
child 11
127fb6a8f706

improve heatmap::add() by using C++23 ranges-v3

configure file | annotate | diff | comparison | revisions
make/project.xml file | annotate | diff | comparison | revisions
src/heatmap.cpp file | annotate | diff | comparison | revisions
--- a/configure	Fri Jan 31 23:20:20 2025 +0100
+++ b/configure	Sat Feb 01 13:59:01 2025 +0100
@@ -293,7 +293,7 @@
             break
         fi
 
-        TEMP_CXXFLAGS="$TEMP_CXXFLAGS -std=c++20"
+        TEMP_CXXFLAGS="$TEMP_CXXFLAGS -std=c++23"
         break
     done
     break
--- a/make/project.xml	Fri Jan 31 23:20:20 2025 +0100
+++ b/make/project.xml	Sat Feb 01 13:59:01 2025 +0100
@@ -2,7 +2,7 @@
 <project version="0.3" xmlns="http://unixwork.de/uwproj">
     <dependency>
         <lang>cpp</lang>
-        <cxxflags>-std=c++20</cxxflags>
+        <cxxflags>-std=c++23</cxxflags>
     </dependency>
 </project>
 
--- a/src/heatmap.cpp	Fri Jan 31 23:20:20 2025 +0100
+++ b/src/heatmap.cpp	Sat Feb 01 13:59:01 2025 +0100
@@ -36,23 +36,18 @@
     for (auto &&line: std::views::split(log, "\n"sv)) {
         if (line.empty()) continue;
         auto parts = std::views::split(line, "#"sv).begin();
-        auto author_range = *parts;
-        std::string author{author_range.begin(), author_range.end()};
+        std::string author{(*parts).begin(), (*parts).end()};
 
         int year = 0;
         unsigned int month = 0, day = 0;
-        unsigned part = 0;
-        for (auto &&date_part: std::views::split(*++parts, "-"sv)) {
-            std::string_view dp{date_part.begin(), date_part.end()};
-            int val;
-            // no error handling, we trust hg and git
-            std::from_chars(dp.begin(), dp.end(), val);
-            switch (part++) {
-                case 0: year = val; break;
-                case 1: month = val; break;
-                default: day = val; break;
-            }
-        }
-        m_heatmap[m_current_repo][author][chrono::year_month_day{chrono::year{year}, chrono::month{month}, chrono::day{day}}]++;
+        auto date_parts = std::views::split(*++parts, "-"sv)
+                          | std::views::transform([](auto r) { return std::string_view(r); })
+                          | std::ranges::to<std::vector>();
+        std::from_chars(date_parts[0].begin(), date_parts[0].end(), year);
+        std::from_chars(date_parts[1].begin(), date_parts[1].end(), month);
+        std::from_chars(date_parts[2].begin(), date_parts[2].end(), day);
+        m_heatmap[m_current_repo][author][chrono::year_month_day{
+            chrono::year{year}, chrono::month{month}, chrono::day{day}
+        }]++;
     }
 }

mercurial