From c500a98722c10b286c38bb24541d658a78d5f1f3 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 13 Mar 2026 00:15:29 -0500 Subject: [PATCH] xo-reader2: + op> support --- include/xo/numeric/FloatIntegerOps.hpp | 4 ++++ include/xo/numeric/FloatOps.hpp | 2 ++ include/xo/numeric/IntegerOps.hpp | 2 ++ include/xo/numeric/NumericDispatch.hpp | 17 ++++++++++++----- include/xo/numeric/NumericOps.hpp | 9 ++++++++- src/numeric/FloatIntegerOps.cpp | 16 ++++++++++++++++ src/numeric/FloatOps.cpp | 8 ++++++++ src/numeric/IntegerOps.cpp | 7 +++++++ src/numeric/NumericDispatch.cpp | 14 +++++++++++++- src/numeric/numeric_register_facets.cpp | 4 ++++ src/numeric/numeric_register_primitives.cpp | 2 ++ 11 files changed, 78 insertions(+), 7 deletions(-) diff --git a/include/xo/numeric/FloatIntegerOps.hpp b/include/xo/numeric/FloatIntegerOps.hpp index 8508402f..972e5736 100644 --- a/include/xo/numeric/FloatIntegerOps.hpp +++ b/include/xo/numeric/FloatIntegerOps.hpp @@ -36,6 +36,8 @@ namespace xo { DFloat * x, DInteger * y); static obj cmp_lessequal(obj rcx, DFloat * x, DInteger * y); + static obj cmp_greater(obj rcx, + DFloat * x, DInteger * y); static obj cmp_greatequal(obj rcx, DFloat * x, DInteger * y); }; @@ -62,6 +64,8 @@ namespace xo { DInteger * x, DFloat * y); static obj cmp_lessequal(obj rcx, DInteger * x, DFloat * y); + static obj cmp_greater(obj rcx, + DInteger * x, DFloat * y); static obj cmp_greatequal(obj rcx, DInteger * x, DFloat * y); }; diff --git a/include/xo/numeric/FloatOps.hpp b/include/xo/numeric/FloatOps.hpp index 3eaabc9c..f9e6338c 100644 --- a/include/xo/numeric/FloatOps.hpp +++ b/include/xo/numeric/FloatOps.hpp @@ -35,6 +35,8 @@ namespace xo { DFloat * x, DFloat * y); static obj cmp_lessequal(obj rcx, DFloat * x, DFloat * y); + static obj cmp_greater(obj rcx, + DFloat * x, DFloat * y); static obj cmp_greatequal(obj rcx, DFloat * x, DFloat * y); }; diff --git a/include/xo/numeric/IntegerOps.hpp b/include/xo/numeric/IntegerOps.hpp index b8342555..90eb6e05 100644 --- a/include/xo/numeric/IntegerOps.hpp +++ b/include/xo/numeric/IntegerOps.hpp @@ -37,6 +37,8 @@ namespace xo { DInteger * x, DInteger * y); static obj cmp_lessequal(obj rcx, DInteger * x, DInteger * y); + static obj cmp_greater(obj rcx, + DInteger * x, DInteger * y); static obj cmp_greatequal(obj rcx, DInteger * x, DInteger * y); diff --git a/include/xo/numeric/NumericDispatch.hpp b/include/xo/numeric/NumericDispatch.hpp index 53b35b97..bd1f4bf4 100644 --- a/include/xo/numeric/NumericDispatch.hpp +++ b/include/xo/numeric/NumericDispatch.hpp @@ -93,27 +93,32 @@ namespace xo { obj x, obj y); - /** compare two numeric values for equality **/ + /** compare two numeric values for equality (==) **/ static obj cmp_equal(obj rcx, obj x, obj y); - /** compare two numeric values for inequality **/ + /** compare two numeric values for inequality (!~=) **/ static obj cmp_notequal(obj rcx, obj x, obj y); - /** compare two numeric values for less **/ + /** compare two numeric values for less (<) **/ static obj cmp_less(obj rcx, obj x, obj y); - /** compare two numeric values for less-or-equal **/ + /** compare two numeric values for less-or-equal (<=) **/ static obj cmp_lessequal(obj rcx, obj x, obj y); - /** compare two numeric values for greater-or-equal **/ + /** compare two numeric values for greater (>) **/ + static obj cmp_greater(obj rcx, + obj x, + obj y); + + /** compare two numeric values for greater-or-equal (>=) **/ static obj cmp_greatequal(obj rcx, obj x, obj y); @@ -135,6 +140,7 @@ namespace xo { typename NumericOps::BinaryOp_Impl cmpne_fn, typename NumericOps::BinaryOp_Impl cmplt_fn, typename NumericOps::BinaryOp_Impl cmple_fn, + typename NumericOps::BinaryOp_Impl cmpgt_fn, typename NumericOps::BinaryOp_Impl cmpge_fn) { KeyType key(typeseq::id().seqno(), @@ -150,6 +156,7 @@ namespace xo { cmpne_fn, cmplt_fn, cmple_fn, + cmpgt_fn, cmpge_fn); } diff --git a/include/xo/numeric/NumericOps.hpp b/include/xo/numeric/NumericOps.hpp index 5d983a98..ea25fb28 100644 --- a/include/xo/numeric/NumericOps.hpp +++ b/include/xo/numeric/NumericOps.hpp @@ -30,9 +30,12 @@ namespace xo { BinaryOp cmpne, BinaryOp cmplt, BinaryOp cmple, + BinaryOp cmpgt, BinaryOp cmpge) : multiply_{multiply}, divide_{divide}, add_{add}, subtract_{subtract}, - cmpeq_{cmpeq}, cmpne_{cmpne}, cmplt_{cmplt}, cmple_{cmple}, cmpge_{cmpge} {} + cmpeq_{cmpeq}, cmpne_{cmpne}, + cmplt_{cmplt}, cmple_{cmple}, + cmpgt_{cmpgt}, cmpge_{cmpge} {} BinaryOp multiply_ = nullptr; BinaryOp divide_ = nullptr; @@ -47,6 +50,8 @@ namespace xo { BinaryOp cmplt_ = nullptr; /** compare numerics (<=) **/ BinaryOp cmple_ = nullptr; + /** compare numerics (>) **/ + BinaryOp cmpgt_ = nullptr; /** compare numerics (>=) **/ BinaryOp cmpge_ = nullptr; }; @@ -68,6 +73,7 @@ namespace xo { BinaryOp_Impl cmpne, BinaryOp_Impl cmplt, BinaryOp_Impl cmple, + BinaryOp_Impl cmpgt, BinaryOp_Impl cmpge) { return AnonymizedNumericOps(reinterpret_cast(multiply), reinterpret_cast(divide), @@ -77,6 +83,7 @@ namespace xo { reinterpret_cast(cmpne), reinterpret_cast(cmplt), reinterpret_cast(cmple), + reinterpret_cast(cmpgt), reinterpret_cast(cmpge)); } }; diff --git a/src/numeric/FloatIntegerOps.cpp b/src/numeric/FloatIntegerOps.cpp index d2fedcfa..fab04cae 100644 --- a/src/numeric/FloatIntegerOps.cpp +++ b/src/numeric/FloatIntegerOps.cpp @@ -74,6 +74,14 @@ namespace xo { x->value() <= DFloat::value_type(y->value())); } + obj + FloatIntegerOps::cmp_greater(obj rcx, + DFloat * x, DInteger * y) + { + return DBoolean::box(rcx.allocator(), + x->value() > DFloat::value_type(y->value())); + } + obj FloatIntegerOps::cmp_greatequal(obj rcx, DFloat * x, DInteger * y) @@ -144,6 +152,14 @@ namespace xo { DFloat::value_type(x->value()) <= y->value()); } + obj + IntegerFloatOps::cmp_greater(obj rcx, + DInteger * x, DFloat * y) + { + return DBoolean::box(rcx.allocator(), + DFloat::value_type(x->value()) > y->value()); + } + obj IntegerFloatOps::cmp_greatequal(obj rcx, DInteger * x, DFloat * y) diff --git a/src/numeric/FloatOps.cpp b/src/numeric/FloatOps.cpp index a549c8ac..be522624 100644 --- a/src/numeric/FloatOps.cpp +++ b/src/numeric/FloatOps.cpp @@ -75,6 +75,14 @@ namespace xo { x->value() <= y->value()); } + obj + FloatOps::cmp_greater(obj rcx, + DFloat * x, DFloat * y) + { + return DBoolean::box(rcx.allocator(), + x->value() > y->value()); + } + obj FloatOps::cmp_greatequal(obj rcx, DFloat * x, DFloat * y) diff --git a/src/numeric/IntegerOps.cpp b/src/numeric/IntegerOps.cpp index af67a5ee..280e89d3 100644 --- a/src/numeric/IntegerOps.cpp +++ b/src/numeric/IntegerOps.cpp @@ -69,6 +69,13 @@ namespace xo { return DBoolean::box(rcx.allocator(), x->value() <= y->value()); } + obj + IntegerOps::cmp_greater(obj rcx, + DInteger * x, DInteger * y) + { + return DBoolean::box(rcx.allocator(), x->value() > y->value()); + } + obj IntegerOps::cmp_greatequal(obj rcx, DInteger * x, DInteger * y) diff --git a/src/numeric/NumericDispatch.cpp b/src/numeric/NumericDispatch.cpp index 0cc0af11..1ebdd414 100644 --- a/src/numeric/NumericDispatch.cpp +++ b/src/numeric/NumericDispatch.cpp @@ -162,13 +162,25 @@ namespace xo { x, y); } + obj + NumericDispatch::cmp_greater(obj rcx, + obj x, + obj y) + { + return dispatch(rcx, + "NumericDispatch::cmp_greater", + "incomparable types in x>y", + &AnonymizedNumericOps::cmpgt_, + x, y); + } + obj NumericDispatch::cmp_greatequal(obj rcx, obj x, obj y) { return dispatch(rcx, - "NumericDispatch::cmp_great", + "NumericDispatch::cmp_greatequal", "incomparable types in x>=y", &AnonymizedNumericOps::cmpge_, x, y); diff --git a/src/numeric/numeric_register_facets.cpp b/src/numeric/numeric_register_facets.cpp index e70abe39..7ef2555a 100644 --- a/src/numeric/numeric_register_facets.cpp +++ b/src/numeric/numeric_register_facets.cpp @@ -43,6 +43,7 @@ namespace xo { &FloatOps::cmp_notequal, &FloatOps::cmp_less, &FloatOps::cmp_lessequal, + &FloatOps::cmp_greater, &FloatOps::cmp_greatequal); NumericDispatch::instance().register_impl @@ -54,6 +55,7 @@ namespace xo { &FloatIntegerOps::cmp_notequal, &FloatIntegerOps::cmp_less, &FloatIntegerOps::cmp_lessequal, + &FloatIntegerOps::cmp_greater, &FloatIntegerOps::cmp_greatequal); NumericDispatch::instance().register_impl @@ -65,6 +67,7 @@ namespace xo { &IntegerFloatOps::cmp_notequal, &IntegerFloatOps::cmp_less, &IntegerFloatOps::cmp_lessequal, + &IntegerFloatOps::cmp_greater, &IntegerFloatOps::cmp_greatequal); NumericDispatch::instance().register_impl @@ -76,6 +79,7 @@ namespace xo { &IntegerOps::cmp_notequal, &IntegerOps::cmp_less, &IntegerOps::cmp_lessequal, + &IntegerOps::cmp_greater, &IntegerOps::cmp_greatequal); log && log(xtag("ANumeric.tseq", typeseq::id())); diff --git a/src/numeric/numeric_register_primitives.cpp b/src/numeric/numeric_register_primitives.cpp index 63c6f5fe..ff2749e3 100644 --- a/src/numeric/numeric_register_primitives.cpp +++ b/src/numeric/numeric_register_primitives.cpp @@ -74,6 +74,8 @@ namespace xo { flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmple", &NumericDispatch::cmp_lessequal, flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_cmpgt", &NumericDispatch::cmp_greater, + flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmpge", &NumericDispatch::cmp_greatequal, flags & InstallFlags::f_essential);