From e39af517b76ed6c4a1add6632fb3e4e1ffe498ba Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Fri, 5 Jul 2024 13:14:28 +0200 Subject: [PATCH] Reapply "workarounds for clang again" This reverts commit be2b22d113ce3f1c9d3a37e38448c1bdb341528a. --- include/views.hpp | 21 +++++++++++++++++++++ src/console_writer.cpp | 2 +- src/utils.cpp | 8 ++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/views.hpp b/include/views.hpp index cc971a7..1a4d530 100644 --- a/include/views.hpp +++ b/include/views.hpp @@ -388,7 +388,16 @@ inline constexpr detail::not_template_adaptor not_template; template auto fold_left_auto(R&& r) { using type = std::ranges::range_value_t; +#ifdef __clang__ + type value{}; + for (const type & v : r) { + value += v; + } + return value; +#else + // On GCC; we can simply use fold left return std::ranges::fold_left(std::forward(r), type{}, std::plus()); +#endif } // TODO(C+23) In the future, we can simply ranges::to but it is not yet implemented with GCC @@ -418,4 +427,16 @@ auto min_with_default(R&& r, std::ranges::range_value_t def) { return def; } +// Stupid clang does not support std::ranges::contains + +template +bool range_contains(const R& r, const std::ranges::range_value_t & value) { +#ifdef __clang__ + return std::ranges::find(std::ranges::begin(r), std::ranges::end(r), value) == std::ranges::end(r); +#else + // On GCC; we can simply use the algorithm + return std::ranges::contains(r, value); +#endif +} + } //end of namespace budget diff --git a/src/console_writer.cpp b/src/console_writer.cpp index bcf3751..eea0896 100644 --- a/src/console_writer.cpp +++ b/src/console_writer.cpp @@ -273,7 +273,7 @@ void budget::console_writer::display_table(std::vector& columns, st auto& row = contents[i]; - const bool underline = std::ranges::contains(lines, i); + const bool underline = range_contains(lines, i); for (size_t j = 0; j < row.size(); j += groups) { size_t acc_width = 0; diff --git a/src/utils.cpp b/src/utils.cpp index 28dec57..8c9c700 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -69,7 +69,11 @@ unsigned short budget::terminal_height(){ std::vector& budget::split(std::string_view s, char delim, std::vector& elems) { for (auto element : s | std::ranges::views::split(delim)) { +#ifdef __clang__ + elems.emplace_back(std::string_view(&*element.begin(), std::ranges::distance(element))); +#else elems.emplace_back(std::string_view(element)); +#endif } return elems; } @@ -82,7 +86,11 @@ std::vector budget::split(std::string_view s, char delim) { std::vector& budget::splitv(std::string_view s, char delim, std::vector& elems) { for (auto element : s | std::ranges::views::split(delim)) { +#ifdef __clang__ + elems.emplace_back(std::string_view(&*element.begin(), std::ranges::distance(element))); +#else elems.emplace_back(element); +#endif } return elems; }