Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/1235d8e34b59320ae91c83bde4d3e9c99dad40f2
>---------------------------------------------------------------
commit 1235d8e34b59320ae91c83bde4d3e9c99dad40f2
Author: Alex Alabuzhev <
alab...@gmail.com>
Date: Mon Jul 6 17:42:19 2026 +0100
Refactoring
>---------------------------------------------------------------
1235d8e34b59320ae91c83bde4d3e9c99dad40f2
far/codepage_selection.cpp | 6 +++---
far/common.tests.cpp | 2 +-
far/common/chrono.hpp | 43 ++++++++++++++-----------------------------
far/common/compiler.hpp | 7 ++-----
far/datetime.cpp | 44 ++++++++++++++++++++++----------------------
far/elevation.cpp | 2 +-
far/platform.cpp | 12 ++++++------
7 files changed, 49 insertions(+), 67 deletions(-)
diff --git a/far/codepage_selection.cpp b/far/codepage_selection.cpp
index 698fae138..7c559114b 100644
--- a/far/codepage_selection.cpp
+++ b/far/codepage_selection.cpp
@@ -614,11 +614,11 @@ void codepages::EditCodePageName()
const auto Position = CodePagesMenu->GetSelectPos();
if (IsPositionStandard(Position))
return;
- string CodePageName = CodePagesMenu->at(Position).Name;
+ string_view CodePageName = CodePagesMenu->at(Position).Name;
const auto BoxPosition = CodePageName.find(BoxSymbols[BS_V1]);
- if (BoxPosition == string::npos)
+ if (BoxPosition == string_view::npos)
return;
- CodePageName.erase(0, BoxPosition + 2);
+ CodePageName.remove_prefix(BoxPosition + 2);
auto EditDialog = MakeDialogItems<EDITCP_COUNT>(
{
diff --git a/far/common.tests.cpp b/far/common.tests.cpp
index 4ad05cabc..4a9eca050 100644
--- a/far/common.tests.cpp
+++ b/far/common.tests.cpp
@@ -440,7 +440,7 @@ TEST_CASE("chrono")
const auto check_split_duration = [](const auto Duration, auto... Args)
{
auto Result = split_duration<decltype(Args)...>(Duration);
- return (... && (Result.template get<decltype(Args)>() == Args));
+ return (... && (std::get<decltype(Args)>(Result) == Args));
};
constexpr auto Duration = 47h + 63min + 71s + 3117ms;
diff --git a/far/common/chrono.hpp b/far/common/chrono.hpp
index 492afd778..4644f7c3a 100644
--- a/far/common/chrono.hpp
+++ b/far/common/chrono.hpp
@@ -37,39 +37,24 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//----------------------------------------------------------------------------
-template<typename... tuple_types>
-class split_duration: public std::tuple<tuple_types...>
+namespace detail
{
-public:
- template<class Rep, class Period>
- constexpr explicit split_duration(std::chrono::duration<Rep, Period> Duration)
+ template<typename CastType>
+ constexpr void set_and_chop(auto& Tuple, auto& Duration)
{
- (..., (set_and_chop<tuple_types>(Duration)));
- }
-
- template<typename type>
- [[nodiscard]]
- constexpr type& get()
- {
- return std::get<type>(*this);
- }
-
- template<typename type>
- [[nodiscard]]
- constexpr const type& get() const
- {
- return std::get<type>(*this);
- }
-
-private:
- template<typename cast_type>
- constexpr void set_and_chop(auto& Duration)
- {
- auto& Element = get<cast_type>();
- Element = std::chrono::duration_cast<cast_type>(Duration);
+ auto& Element = std::get<CastType>(Tuple);
+ Element = std::chrono::duration_cast<CastType>(Duration);
Duration -= Element;
}
-};
+}
+
+template<typename... TupleTypes>
+constexpr auto split_duration(auto Duration)
+{
+ std::tuple<TupleTypes...> Result;
+ (..., (detail::set_and_chop<TupleTypes>(Result, Duration)));
+ return Result;
+}
inline namespace literals
{
diff --git a/far/common/compiler.hpp b/far/common/compiler.hpp
index 3f0f02c66..633a5ac1a 100644
--- a/far/common/compiler.hpp
+++ b/far/common/compiler.hpp
@@ -130,10 +130,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define COMPILER_VERSION_MINOR __clang_minor__
#define COMPILER_VERSION_PATCH __clang_patchlevel__
#else
-#define COMPILER_NAME "Unknown compiler"
-#define COMPILER_VERSION_MAJOR 0
-#define COMPILER_VERSION_MINOR 0
-#define COMPILER_VERSION_PATCH 0
+#error Unknown compiler
#endif
//----------------------------------------------------------------------------
@@ -169,7 +166,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define REQUIRE_COMPILER(compiler, major, minor, patch, ...) \
static_assert( \
CHECK_COMPILER(compiler, major, minor, patch), \
- COMPILER_NAME " " #major "." #minor "." #patch " (or higher) required" __VA_ARGS__ \
+ COMPILER_NAME " " #major "." #minor "." #patch __VA_ARGS__ " or higher required" \
)
#endif // COMPILER_HPP_6A237B14_5BAA_4106_9D7F_7C7BA14A36B0
diff --git a/far/datetime.cpp b/far/datetime.cpp
index 051b12e41..5d833eb61 100644
--- a/far/datetime.cpp
+++ b/far/datetime.cpp
@@ -341,8 +341,8 @@ static string StrFTime(string_view const Format, const tm& Time)
return 0h / 1h;
using namespace std::chrono;
- const auto Offset = split_duration<hours, minutes>(Tz->Offset);
- return Offset.get<hours>() / 1h * 100 + Offset.get<minutes>() / 1min;
+ const auto [Hours, Minutes] = split_duration<hours, minutes>(Tz->Offset);
+ return Hours / 1h * 100 + Minutes / 1min;
}();
far::format_to(Result, L"{:+05}"sv, HHMM);
@@ -673,16 +673,16 @@ std::tuple<string, string> duration_to_string(os::chrono::duration Duration)
using namespace std::chrono;
using namespace os::chrono;
- const auto Parts = split_duration<days, hours, minutes, seconds, hectonanoseconds>(Duration);
+ const auto [Days, Hours, Minutes, Seconds, Hectonanoseconds] = split_duration<days, hours, minutes, seconds, hectonanoseconds>(Duration);
return
{
- str(Parts.get<days>() / 1_d),
+ str(Days / 1_d),
far::format(L"{0:02}{4}{1:02}{4}{2:02}{5}{3:0{6}}"sv,
- Parts.get<hours>() / 1h,
- Parts.get<minutes>() / 1min,
- Parts.get<seconds>() / 1s,
- Parts.get<hectonanoseconds>() / 1_hns,
+ Hours / 1h,
+ Minutes / 1min,
+ Seconds / 1s,
+ Hectonanoseconds / 1_hns,
locale.time_separator(),
locale.decimal_separator(),
decimal_duration_width<hectonanoseconds>()
@@ -694,12 +694,12 @@ string duration_to_string_hms(os::chrono::duration Duration)
{
using namespace std::chrono;
- const auto Parts = split_duration<hours, minutes, seconds>(Duration);
+ const auto [Hours, Minutes, Seconds] = split_duration<hours, minutes, seconds>(Duration);
return far::format(L"{0:02}{3}{1:02}{3}{2:02}"sv,
- Parts.get<hours>() / 1h,
- Parts.get<minutes>() / 1min,
- Parts.get<seconds>() / 1s,
+ Hours / 1h,
+ Minutes / 1min,
+ Seconds / 1s,
locale.time_separator()
);
}
@@ -709,13 +709,13 @@ string duration_to_string_hr(os::chrono::duration Duration)
using namespace std::chrono;
using namespace os::chrono;
- const auto Parts = split_duration<days, hours, minutes, seconds, hectonanoseconds>(Duration);
+ const auto [Days, Hours, Minutes, Seconds, Hectonanoseconds] = split_duration<days, hours, minutes, seconds, hectonanoseconds>(Duration);
const long long Values[]
{
- Parts.get<days>() / 1_d,
- Parts.get<hours>() / 1h,
- Parts.get<minutes>() / 1min,
+ Days / 1_d,
+ Hours / 1h,
+ Minutes / 1min,
};
string Result;
@@ -726,15 +726,15 @@ string duration_to_string_hr(os::chrono::duration Duration)
far::format_to(Result, L"{}{} "sv, v, s);
}
- const auto Seconds = Parts.get<seconds>() / 1s;
- const auto Decimals = Parts.get<hectonanoseconds>() / 1_hns;
+ const auto SecondsInteger = Seconds / 1s;
+ const auto SecondsDecimal = Hectonanoseconds / 1_hns;
- if (Seconds || Decimals || Result.empty())
+ if (SecondsInteger || SecondsDecimal || Result.empty())
{
- far::format_to(Result, L"{}"sv, Seconds);
+ far::format_to(Result, L"{}"sv, SecondsInteger);
- if (Decimals)
- far::format_to(Result, L".{:0{}}"sv, Decimals, decimal_duration_width<hectonanoseconds>());
+ if (SecondsDecimal)
+ far::format_to(Result, L".{:0{}}"sv, SecondsDecimal, decimal_duration_width<hectonanoseconds>());
Result += L's';
}
diff --git a/far/elevation.cpp b/far/elevation.cpp
index 7d98247f6..69c8688db 100644
--- a/far/elevation.cpp
+++ b/far/elevation.cpp
@@ -193,7 +193,7 @@ static void ReadPipe(const os::handle& Pipe, os::security::descriptor& Data)
Data.reset(static_cast<SECURITY_DESCRIPTOR*>(LocalAlloc(LMEM_FIXED, Size)));
if (!Data)
- throw far_exception(far::format(L"LocalAlloc({}): {}"sv, Size, os::last_error()));
+ throw far_exception(far::format(L"LocalAlloc({})"sv, Size));
pipe::read(Pipe, Data.get(), Size);
}
diff --git a/far/platform.cpp b/far/platform.cpp
index d5286590d..8ac8024a1 100644
--- a/far/platform.cpp
+++ b/far/platform.cpp
@@ -123,7 +123,7 @@ namespace os
switch (WaitForSingleObject(Handle, Timeout? *Timeout / 1ms : INFINITE))
{
case WAIT_ABANDONED:
- LOGWARNING(L"WaitForSingleObject(): WAIT_ABANDONED for handle {}"sv, Handle);
+ LOGWARNING(L"WaitForSingleObject({}): WAIT_ABANDONED"sv, Handle);
[[fallthrough]];
case WAIT_OBJECT_0:
return true;
@@ -132,7 +132,7 @@ namespace os
return false;
case WAIT_FAILED:
- throw far_fatal_exception(far::format(L"WaitForSingleobject failed: {}"sv, last_error()));
+ throw far_fatal_exception(far::format(L"WaitForSingleobject({})"sv, Handle));
default:
std::unreachable();
@@ -156,12 +156,12 @@ namespace os
if (in_closed_range<size_t>(WAIT_ABANDONED, Result, WAIT_ABANDONED + Handles.size() - 1))
{
const auto HandleIndex = Result - WAIT_ABANDONED;
- LOGWARNING(L"WaitForMultipleObjects(): WAIT_ABANDONED for handle {} ({}/{})"sv, Handles[HandleIndex], HandleIndex, Handles.size());
+ LOGWARNING(L"WaitForMultipleObjects({}): WAIT_ABANDONED ({}/{})"sv, Handles[HandleIndex], HandleIndex, Handles.size());
return HandleIndex;
}
if (Result == WAIT_FAILED)
- throw far_fatal_exception(far::format(L"WaitForMultipleObjects failed: {}"sv, last_error()));
+ throw far_fatal_exception(far::format(L"WaitForMultipleObjects({})"sv, Handles.size()));
std::unreachable();
}
@@ -1050,7 +1050,7 @@ namespace rtdl
}
if (!*m_module && Mandatory)
- throw far_fatal_exception(far::format(L"Error loading {}: {}"sv, m_name, last_error()));
+ throw far_fatal_exception(far::format(L"Error loading {}"sv, m_name));
return m_module->get();
}
@@ -1079,7 +1079,7 @@ namespace rtdl
if (const auto Pointer = *m_Pointer; Pointer || !Mandatory)
return Pointer;
- throw far_fatal_exception(far::format(L"{}!{} is missing: {}"sv, m_Module->name(), encoding::ascii::get_chars(m_Name), last_error()));
+ throw far_fatal_exception(far::format(L"{}!{} is missing"sv, m_Module->name(), encoding::ascii::get_chars(m_Name)));
}
}