[FarGroup/FarManager] master: Refactoring (7036e69e2)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Apr 13, 2026, 4:46:06 PM (3 days ago) Apr 13
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/7036e69e2cf74a5f9cc179f8c440da582f4040dd

>---------------------------------------------------------------

commit 7036e69e2cf74a5f9cc179f8c440da582f4040dd
Author: Alex Alabuzhev <alab...@gmail.com>
Date: Mon Apr 13 21:38:50 2026 +0100

Refactoring


>---------------------------------------------------------------

7036e69e2cf74a5f9cc179f8c440da582f4040dd
far/common.tests.cpp | 41 ++++++++++++++++++++++++++++++-----------
far/common/enum_tokens.hpp | 33 +++++++++++++++++++++++++++------
2 files changed, 57 insertions(+), 17 deletions(-)

diff --git a/far/common.tests.cpp b/far/common.tests.cpp
index b98f3c564..45ff21c1e 100644
--- a/far/common.tests.cpp
+++ b/far/common.tests.cpp
@@ -487,18 +487,27 @@ TEST_CASE("enum_substrings")

#include "common/enum_tokens.hpp"

-template<typename T>
-void test_enum_tokens(const auto& Expected, string_view const Input, string_view const Separators)
+struct enum_tokens_test_helper
{
- auto Iterator = Expected.begin();
-
- for (const auto& t: T(Input, Separators))
+ template<typename T>
+ static void test(const auto& Expected, string_view const Input, string_view const Separators)
{
- REQUIRE(t == *Iterator++);
+ auto Iterator = Expected.begin();
+
+ for (const auto& t: T(Input, Separators))
+ {
+ REQUIRE(t == *Iterator++);
+ }
+
+ REQUIRE(Iterator == Expected.end());
}

- REQUIRE(Iterator == Expected.end());
-}
+ template<typename T>
+ static void run(auto& Test)
+ {
+ Test.template operator()<T>();
+ }
+};

TEST_CASE("enum_tokens")
{
@@ -506,6 +515,7 @@ TEST_CASE("enum_tokens")
{
simple,
quotes,
+ q_keep,
trim
};

@@ -521,16 +531,25 @@ TEST_CASE("enum_tokens")
{ test_type::simple, { {}, {} }, L",", L","sv },
{ test_type::simple, { L"abc"sv, {}, L"def"sv, L" q "sv, L"123"sv, {} }, L"abc;,def; q ,123;"sv, L",;"sv },
{ test_type::quotes, { L"abc;"sv, L"de;,f"sv, L"123"sv, {}, {} }, L"\"abc;\",\"de;,f\";123;;"sv, L",;"sv },
+ { test_type::q_keep, { L"\"abc;\""sv, L"\"de;,f\""sv, L"123"sv, {}, {} }, L"\"abc;\",\"de;,f\";123;;"sv, L",;"sv },
{ test_type::trim, { L"abc"sv, L"def"sv, {}, {} }, L" abc| def | |"sv, L"|"sv },
};

+ using helper = enum_tokens_test_helper;
+
for (const auto& i: Tests)
{
+ const auto test = [&]<typename T>()
+ {
+ helper::test<T>(i.Expected, i.Input, i.Separators);
+ };
+
switch(i.TestType)
{
- case test_type::simple: test_enum_tokens<enum_tokens>(i.Expected, i.Input, i.Separators); break;
- case test_type::quotes: test_enum_tokens<enum_tokens_with_quotes>(i.Expected, i.Input, i.Separators); break;
- case test_type::trim: test_enum_tokens<enum_tokens_custom_t<with_trim>>(i.Expected, i.Input, i.Separators); break;
+ case test_type::simple: helper::run<enum_tokens>(test); break;
+ case test_type::quotes: helper::run<enum_tokens_with_quotes>(test); break;
+ case test_type::q_keep: helper::run<enum_tokens_custom_t<with_quotes_keep>>(test); break;
+ case test_type::trim: helper::run<enum_tokens_custom_t<with_trim>>(test); break;
default:
std::unreachable();
}
diff --git a/far/common/enum_tokens.hpp b/far/common/enum_tokens.hpp
index 523927d2e..5df66f2c2 100644
--- a/far/common/enum_tokens.hpp
+++ b/far/common/enum_tokens.hpp
@@ -118,13 +118,12 @@ WARNING_POP()
}
};

- class quotes_overrider
+ class quotes_overrider_simple: private null_overrider
{
public:
void reset() noexcept
{
m_InQuotes = false;
- m_MetQuote = false;
}

[[nodiscard]]
@@ -133,13 +132,35 @@ WARNING_POP()
if (i == L'"')
{
m_InQuotes = !m_InQuotes;
- m_MetQuote = true;
return true;
}

return m_InQuotes;
}

+ using null_overrider::postprocess;
+
+ bool m_InQuotes{};
+ };
+
+ class quotes_overrider_unquote: private quotes_overrider_simple
+ {
+ public:
+ void reset() noexcept
+ {
+ m_MetQuote = false;
+ }
+
+ [[nodiscard]]
+ bool active(wchar_t i) noexcept
+ {
+ if (!quotes_overrider_simple::active(i))
+ return false;
+
+ m_MetQuote = true;
+ return true;
+ }
+
void postprocess(std::wstring_view& Value)
{
if (!m_MetQuote)
@@ -151,7 +172,6 @@ WARNING_POP()
Value = m_Cache;
}

- bool m_InQuotes{};
bool m_MetQuote{};
std::wstring m_Cache;
};
@@ -257,14 +277,15 @@ private:

using enum_tokens = enum_tokens_t<detail::simple_policy>;

-using with_quotes = detail::quotes_overrider;
+using with_quotes_keep = detail::quotes_overrider_simple;
+using with_quotes_remove = detail::quotes_overrider_unquote;
using with_trim = detail::trimmer;

template<typename... args>
using enum_tokens_custom_t = enum_tokens_t<detail::custom_policy<args...>>;

template<typename... args>
-using enum_tokens_with_quotes_t = enum_tokens_custom_t<with_quotes, args...>;
+using enum_tokens_with_quotes_t = enum_tokens_custom_t<with_quotes_remove, args...>;

using enum_tokens_with_quotes = enum_tokens_with_quotes_t<>;



Reply all
Reply to author
Forward
0 new messages