Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/2d06495df94035c50c47099d9615c9db134b1d22
>---------------------------------------------------------------
commit 2d06495df94035c50c47099d9615c9db134b1d22
Author: Michael Z. Kadaner <
MKad...@users.noreply.github.com>
Date: Sat Jun 13 14:23:42 2026 -0400
Added `segment::start_or` and `segment::end_or`
>---------------------------------------------------------------
2d06495df94035c50c47099d9615c9db134b1d22
far/common.tests.cpp | 4 ++++
far/common/segment.hpp | 14 +++++++++++---
far/vmenu.cpp | 4 +---
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/far/common.tests.cpp b/far/common.tests.cpp
index 400c998e7..4ad05cabc 100644
--- a/far/common.tests.cpp
+++ b/far/common.tests.cpp
@@ -1258,6 +1258,10 @@ TEST_CASE("segment.constexpr")
STATIC_REQUIRE(segment{ 5, segment::sentinel_tag{ 7 } }.start() == 5);
STATIC_REQUIRE(segment{ 5, segment::sentinel_tag{ 7 } }.length() == 2);
STATIC_REQUIRE(segment{ 5, segment::length_tag{ 2 } }.end() == 7);
+ STATIC_REQUIRE(segment{ 5, segment::sentinel_tag{ 7 } }.start_or(42) == 5);
+ STATIC_REQUIRE(segment{ 5, segment::length_tag{ 2 } }.end_or(42) == 7);
+ STATIC_REQUIRE(segment{}.start_or(42) == 42);
+ STATIC_REQUIRE(segment{}.end_or(42) == 42);
STATIC_REQUIRE(segment{}.ray() == segment{ 0, segment::sentinel_tag{ std::numeric_limits<int>::max() } });
STATIC_REQUIRE(segment{}.ray(42) == segment{ 42, segment::sentinel_tag{ std::numeric_limits<int>::max() } });
STATIC_REQUIRE((segment{}.ray(42).iota() | std::views::drop(3) | std::views::take(3)).front() == 45);
diff --git a/far/common/segment.hpp b/far/common/segment.hpp
index dcfad4f32..a931a2405 100644
--- a/far/common/segment.hpp
+++ b/far/common/segment.hpp
@@ -40,7 +40,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//----------------------------------------------------------------------------
-template<typename T>
+template<std::integral T>
class segment_t
{
[[nodiscard]]
@@ -77,6 +77,14 @@ public:
[[nodiscard]]
constexpr T end() const noexcept { assert(!empty()); return m_End; }
+ template<std::convertible_to<T> U>
+ [[nodiscard]]
+ constexpr T start_or(U default_value) const noexcept { return empty() ? default_value : start(); }
+
+ template<std::convertible_to<T> U>
+ [[nodiscard]]
+ constexpr T end_or(U default_value) const noexcept { return empty() ? default_value : end(); }
+
[[nodiscard]]
constexpr auto iota() const noexcept { return empty() ? std::views::iota(T{}, T{}) : std::views::iota(start(), end()); }
@@ -94,14 +102,14 @@ public:
: segment_t{ InitialPoint, length_tag{ domain_max() } };
}
- template<typename U>
+ template<std::convertible_to<T> U>
[[nodiscard]]
static constexpr segment_t horizontal_extent(const rectangle_t<U>& rect) noexcept
{
return { rect.left, length_tag{ rect.width() } };
}
- template<typename U>
+ template<std::convertible_to<T> U>
[[nodiscard]]
static constexpr segment_t vertical_extent(const rectangle_t<U>& rect) noexcept
{
diff --git a/far/vmenu.cpp b/far/vmenu.cpp
index 67b3c6bf6..135e06ecd 100644
--- a/far/vmenu.cpp
+++ b/far/vmenu.cpp
@@ -3590,9 +3590,7 @@ int VMenu::GetItemVisualLength(const menu_item_ex& Item) const
int VMenu::SafeGetItemAnnotationStart(const menu_item_ex& Item) const
{
- if (!m_ItemAnnotationProvider) return 0;
- const auto Annotation{ m_ItemAnnotationProvider(Item) };
- return Annotation.empty() ? 0 : Annotation.start();
+ return m_ItemAnnotationProvider ? m_ItemAnnotationProvider(Item).start_or(0) : 0;
}
#ifdef ENABLE_TESTS