[FarGroup/FarManager] master: Added `segment::start_or` and `segment::end_or` (2d06495df)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Jun 15, 2026, 1:31:04 PM (2 days ago) Jun 15
to farco...@googlegroups.com
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


Reply all
Reply to author
Forward
0 new messages