diff -r 98312f94dbdd -r bf159cf9f4b6 src/heatmap.cpp --- 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::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} + }]++; } }