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<>;