[FarGroup/FarManager] master: Refactoring (0be4f12c3)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
May 14, 2026, 7:46:06 PM (13 days ago) May 14
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/0be4f12c3ddf0377433440cd985d94f78fc4499f

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

commit 0be4f12c3ddf0377433440cd985d94f78fc4499f
Author: Alex Alabuzhev <alab...@gmail.com>
Date: Fri May 15 00:42:04 2026 +0100

Refactoring


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

0be4f12c3ddf0377433440cd985d94f78fc4499f
far/macroapi.cpp | 12 ++++++------
far/manager.cpp | 4 +++-
far/panel.cpp | 2 +-
far/processname.cpp | 4 ++--
far/string_sort.cpp | 29 +++++++++++++++--------------
far/string_utils.cpp | 23 +++++++++++++++--------
far/string_utils.hpp | 2 ++
7 files changed, 44 insertions(+), 32 deletions(-)

diff --git a/far/macroapi.cpp b/far/macroapi.cpp
index 80a9af1de..722560ae8 100644
--- a/far/macroapi.cpp
+++ b/far/macroapi.cpp
@@ -1658,10 +1658,10 @@ void FarMacroApi::indexFunc() const
const auto& s = Params[0].toString();
const auto& p = Params[1].toString();

- const auto StrStr = [](const string& Str1, const string& Str2) { return std::ranges::search(Str1, Str2); };
- const auto StrStrI = [](const string& Str1, const string& Str2) { return std::ranges::search(Str1, Str2, string_comparer_icase{}); };
+ const auto Result = Params[2].asInteger()?
+ std::ranges::search(s, p) :
+ std::ranges::search(s, p, string_comparer_icase{});

- const auto Result = Params[2].asInteger()? StrStr(s, p) : StrStrI(s, p);
const auto Position = Result.empty()? -1 : Result.begin() - s.cbegin();
PushValue(Position);
}
@@ -1673,10 +1673,10 @@ void FarMacroApi::rindexFunc() const
const auto& s = Params[0].toString();
const auto& p = Params[1].toString();

- const auto RevStrStr = [](const string& Str1, const string& Str2) { return std::ranges::find_end(Str1, Str2); };
- const auto RevStrStrI = [](const string& Str1, const string& Str2) { return std::ranges::find_end(Str1, Str2, string_comparer_icase{}); };
+ const auto Result = Params[2].asInteger()?
+ std::ranges::find_end(s, p) :
+ std::ranges::find_end(s, p, string_comparer_icase{});

- const auto Result = Params[2].asInteger()? RevStrStr(s, p) : RevStrStrI(s, p);
const auto Position = Result.empty()? -1 : Result.begin() - s.cbegin();
PushValue(Position);
}
diff --git a/far/manager.cpp b/far/manager.cpp
index 1434b0abe..ef1fc6689 100644
--- a/far/manager.cpp
+++ b/far/manager.cpp
@@ -399,7 +399,9 @@ int Manager::GetModalExitCode() const
*/
int Manager::CountWindowsWithName(string_view const Name, bool IgnoreCase) const
{
- const auto AreEqual = IgnoreCase? equal_icase : equal;
+ using comparer = bool(*)(string_view, string_view);
+ comparer const Equal = equal, EqualIcase = equal_icase;
+ const auto AreEqual = IgnoreCase? EqualIcase : Equal;

string strType, strCurName;

diff --git a/far/panel.cpp b/far/panel.cpp
index 1e9814ef6..075aa4f25 100644
--- a/far/panel.cpp
+++ b/far/panel.cpp
@@ -343,7 +343,7 @@ bool Panel::SetCurPath()
{
// Propagate passive panel curent directory to the environment
// (only if it won't be overwritten by the active)
- if (!AnotherPanel->m_CurDir.empty() && (m_CurDir.empty() || !string_comparer_icase{}(AnotherPanel->m_CurDir[0], m_CurDir[0])))
+ if (!AnotherPanel->m_CurDir.empty() && (m_CurDir.empty() || !equal_icase(AnotherPanel->m_CurDir[0], m_CurDir[0])))
{
set_drive_env_curdir(AnotherPanel->m_CurDir);
console.propagate_cd(AnotherPanel->m_CurDir);
diff --git a/far/processname.cpp b/far/processname.cpp
index 941984ae4..021688b9d 100644
--- a/far/processname.cpp
+++ b/far/processname.cpp
@@ -185,7 +185,7 @@ bool CmpName(const string_view pattern, string_view str, const bool skippath, co
continue;
}

- if (string_comparer_icase()(ch, pattern[i]))
+ if (equal_icase(ch, pattern[i]))
return true;
}

@@ -261,7 +261,7 @@ bool CmpName(const string_view pattern, string_view str, const bool skippath, co
}
}

- if (si < str.size() && string_comparer_icase()(pc, str[si]))
+ if (si < str.size() && equal_icase(pc, str[si]))
{
++pi;
++si;
diff --git a/far/string_sort.cpp b/far/string_sort.cpp
index 8db3574e0..d0ffd63c2 100644
--- a/far/string_sort.cpp
+++ b/far/string_sort.cpp
@@ -125,7 +125,10 @@ struct ordinal_comparer_icase
if (Char1 == Char2)
return std::strong_ordering::equal;

- return ordinal_comparer{}(upper(Char1), upper(Char2));
+ wchar_t Buffer[]{ Char1, Char2 };
+ inplace::upper(Buffer);
+
+ return ordinal_comparer{}(Buffer[0], Buffer[1]);
}

static constexpr bool ignore_case = true;
@@ -152,10 +155,7 @@ static auto compare_ordinal_t(const string_view Str1, const string_view Str2)
return windows_to_std(Result);
}

- return per_char_compare(Str1, Str2, [](string_view::const_iterator& It1, string_view::const_iterator, string_view::const_iterator& It2, string_view::const_iterator)
- {
- return Comparer{}(*It1++, *It2++);
- });
+ return std::lexicographical_compare_three_way(ALL_CONST_RANGE(Str1), ALL_CONST_RANGE(Str2), Comparer{});
}

static auto compare_ordinal(const string_view Str1, const string_view Str2)
@@ -265,24 +265,21 @@ struct invariant_comparer_icase
if (Char1 == Char2)
return std::strong_ordering::equal;

- return invariant_comparer{}(upper(Char1), upper(Char2));
+ wchar_t Buffer[]{ Char1, Char2 };
+ inplace::upper(Buffer);
+
+ return invariant_comparer{}(Buffer[0], Buffer[1]);
}
};

static auto compare_invariant(const string_view Str1, const string_view Str2)
{
- return per_char_compare(Str1, Str2, [](string_view::const_iterator& It1, string_view::const_iterator, string_view::const_iterator& It2, string_view::const_iterator)
- {
- return invariant_comparer{}(*It1++, *It2++);
- });
+ return std::lexicographical_compare_three_way(ALL_CONST_RANGE(Str1), ALL_CONST_RANGE(Str2), invariant_comparer{});
}

static auto compare_invariant_icase(const string_view Str1, const string_view Str2)
{
- return per_char_compare(Str1, Str2, [](string_view::const_iterator& It1, string_view::const_iterator, string_view::const_iterator& It2, string_view::const_iterator)
- {
- return invariant_comparer{}(upper(*It1++), upper(*It2++));
- });
+ return std::lexicographical_compare_three_way(ALL_CONST_RANGE(Str1), ALL_CONST_RANGE(Str2), invariant_comparer_icase{});
}

static auto compare_invariant_numeric(const string_view Str1, const string_view Str2)
@@ -450,9 +447,13 @@ TEST_CASE("strings.sorting")

for (const auto& i: Tests)
{
+ REQUIRE(compare_ordinal_numeric(i.Str1, i.Str2) == i.CaseResult);
+ REQUIRE(compare_ordinal_numeric_icase(i.Str1, i.Str2) == i.IcaseResult);
REQUIRE(compare_invariant_numeric(i.Str1, i.Str2) == i.CaseResult);
REQUIRE(compare_invariant_numeric_icase(i.Str1, i.Str2) == i.IcaseResult);

+ REQUIRE(invert(compare_ordinal_numeric(i.Str2, i.Str1)) == i.CaseResult);
+ REQUIRE(invert(compare_ordinal_numeric_icase(i.Str2, i.Str1)) == i.IcaseResult);
REQUIRE(invert(compare_invariant_numeric(i.Str2, i.Str1)) == i.CaseResult);
REQUIRE(invert(compare_invariant_numeric_icase(i.Str2, i.Str1)) == i.IcaseResult);
}
diff --git a/far/string_utils.cpp b/far/string_utils.cpp
index 48edb3117..d12ff27ec 100644
--- a/far/string_utils.cpp
+++ b/far/string_utils.cpp
@@ -39,6 +39,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Internal:
#include "exception.hpp"
#include "interf.hpp"
+#include "string_sort.hpp"

// Platform:

@@ -187,9 +188,9 @@ size_t string_comparer_icase::operator()(string_view const Str) const
return make_hash(upper(Str));
}

-bool string_comparer_icase::operator()(wchar_t Chr1, wchar_t Chr2) const
+bool string_comparer_icase::operator()(wchar_t const Chr1, wchar_t const Chr2) const
{
- return Chr1 == Chr2 || upper(Chr1) == upper(Chr2);
+ return equal_icase(Chr1, Chr2);
}

bool string_comparer_icase::operator()(const string_view Str1, const string_view Str2) const
@@ -197,9 +198,19 @@ bool string_comparer_icase::operator()(const string_view Str1, const string_view
return equal_icase(Str1, Str2);
}

+static bool equal_icase_impl(string_view const Str1, string_view const Str2)
+{
+ return std::is_eq(string_sort::ordinal::compare_icase(Str1, Str2));
+}
+
+bool equal_icase(wchar_t const Char1, wchar_t const Char2)
+{
+ return Char1 == Char2 || equal_icase_impl({ &Char1, 1 }, { &Char2, 1 });
+}
+
bool equal_icase(const string_view Str1, const string_view Str2)
{
- return Str1 == Str2 || std::ranges::equal(Str1, Str2, string_comparer_icase{});
+ return Str1 == Str2 || equal_icase_impl(Str1, Str2);
}

bool starts_with_icase(const string_view Str, const string_view Prefix)
@@ -227,11 +238,7 @@ size_t find_icase(string_view const Str, string_view const What, size_t Pos)

size_t find_icase(string_view const Str, wchar_t const What, size_t Pos)
{
- if (Pos >= Str.size())
- return Str.npos;
-
- const auto It = std::ranges::find_if(Str.cbegin() + Pos, Str.cend(), [&](wchar_t const Char){ return string_comparer_icase{}(What, Char); });
- return It == Str.cend() ? Str.npos : It - Str.cbegin();
+ return find_icase(Str, string_view{ &What, 1 }, Pos);
}

bool contains_icase(const string_view Str, const string_view What)
diff --git a/far/string_utils.hpp b/far/string_utils.hpp
index 829a68cec..4e583c493 100644
--- a/far/string_utils.hpp
+++ b/far/string_utils.hpp
@@ -124,6 +124,8 @@ template<typename T>
using unordered_string_multimap_icase = std::unordered_multimap<string, T, string_comparer_icase, string_comparer_icase>;


+[[nodiscard]]
+bool equal_icase(wchar_t Char1, wchar_t Char2);
[[nodiscard]]
bool equal_icase(string_view Str1, string_view Str2);
[[nodiscard]]


Reply all
Reply to author
Forward
0 new messages