Function std.checkedint.Checked.opCmp
Compares this
against rhs
for ordering. If Hook
defines hookOpCmp
,
the function forwards to hook
. Otherwise, the
result of the built-in comparison operation is returned.
auto opCmp(U, _)
(
const U rhs
)
if (isIntegral!U || isFloatingPoint!U || is(U == bool));
auto opCmp(U, Hook1, _)
(
Checked!(U,Hook1) rhs
);
If U
is also an instance of Checked
, both hooks (left- and right-hand
side) are introspected for the method hookOpCmp
. If both define it,
priority is given to the left-hand side.
Parameters
Name | Description |
---|---|
rhs | The right-hand side operand |
U | either the type of rhs or the underlying type
if rhs is a Checked instance |
Hook1 | If rhs is a Checked instance, Hook1 represents
the instance's behavior hook |
Returns
The result of hookOpCmp
if hook
defines hookOpCmp
. If
U
is an instance of Checked
and hook
does not define
hookOpCmp
, result of rhs
is returned.
If none of the instances specify the behavior via hookOpCmp
,
-1
is returned if lhs
is lesser than rhs
, 1
if lhs
is greater than rhs
and 0
on equality.
Example
import std .traits : isUnsigned;
static struct MyHook
{
static bool thereWereErrors;
static int hookOpCmp(L, R)(L lhs, R rhs)
{
static if (isUnsigned!L && !isUnsigned!R)
{
if (rhs < 0 && rhs >= lhs)
thereWereErrors = true;
}
else static if (isUnsigned!R && !isUnsigned!L)
{
if (lhs < 0 && lhs >= rhs)
thereWereErrors = true;
}
// Preserve built-in behavior.
return lhs < rhs ? -1 : lhs > rhs;
}
}
auto a = checked!MyHook(-42);
assert(a > uint(42));
assert(MyHook .thereWereErrors);
static struct MyHook2
{
static int hookOpCmp(L, R)(L lhs, R rhs)
{
// Default behavior
return lhs < rhs ? -1 : lhs > rhs;
}
}
MyHook .thereWereErrors = false;
assert(Checked!(uint, MyHook2)(uint(-42)) <= a);
//assert(Checked!(uint, MyHook2)(uint(-42)) >= a);
// Hook on left hand side takes precedence, so no errors
assert(!MyHook .thereWereErrors);
assert(a <= Checked!(uint, MyHook2)(uint(-42)));
assert(MyHook .thereWereErrors);