saturated

Saturated arithmetic on integers.

  1. Int saturated(Int x, Int y)
  2. Int saturated(Int x, Int y)
    ref pure nothrow @safe @nogc
    Int
    saturated
    (
    string op
    Int
    )
    (
    return ref Int x
    ,
    Int y
    )
    if (
    (
    is(Int == int) ||
    is(Int == long)
    ||
    is(Int == uint)
    ||
    is(Int == ulong)
    )
    &&
    op.length == 2
    &&
    op[1] == '='
    )

Examples

Operator assignment is also possible.

auto a = -42;
assert(saturated!"-="(a, int.max) == a && a == int.min);

auto b = 42u;
assert(saturated!"-="(b, uint.max) == b && b == uint.min);

Signed integers

assert(saturated!"+"(int.min, int.min) == int.min);
assert(saturated!"+"(int.min, -42) == int.min);
assert(saturated!"+"(int.min, +42) == int.min + 42);
assert(saturated!"+"(int.min, int.max) == -1);
assert(saturated!"+"(-42, int.min) == int.min);
assert(saturated!"+"(+42, int.min) == int.min + 42);
assert(saturated!"+"(-42, int.max) == int.max - 42);
assert(saturated!"+"(+42, int.max) == int.max);
assert(saturated!"+"(int.max, int.min) == -1);
assert(saturated!"+"(int.max, -42) == int.max - 42);
assert(saturated!"+"(int.max, +42) == int.max);
assert(saturated!"+"(int.max, int.max) == int.max);

assert(saturated!"-"(int.min, int.min) == 0);
assert(saturated!"-"(int.min, -42) == int.min + 42);
assert(saturated!"-"(int.min, +42) == int.min);
assert(saturated!"-"(int.min, int.max) == int.min);
assert(saturated!"-"(-42, int.min) == -42 - int.min);
assert(saturated!"-"(+42, int.min) == int.max);
assert(saturated!"-"(-42, int.max) == int.min);
assert(saturated!"-"(+42, int.max) == 42 - int.max);
assert(saturated!"-"(int.max, int.min) == int.max);
assert(saturated!"-"(int.max, -42) == int.max);
assert(saturated!"-"(int.max, +42) == int.max - 42);
assert(saturated!"-"(int.max, int.max) == 0);

Unsigned integers

assert(saturated!"+"(uint.min, uint.min) == uint.min);
assert(saturated!"+"(uint.min, 42u) == uint.min + 42);
assert(saturated!"+"(uint.min, uint.max) == uint.max);
assert(saturated!"+"(42u, uint.min) == uint.min + 42);
assert(saturated!"+"(42u, uint.max) == uint.max);
assert(saturated!"+"(uint.max, uint.min) == uint.max);
assert(saturated!"+"(uint.max, 42u) == uint.max);
assert(saturated!"+"(uint.max, uint.max) == uint.max);

assert(saturated!"-"(uint.min, uint.min) == 0);
assert(saturated!"-"(uint.min, 42u) == uint.min);
assert(saturated!"-"(uint.min, uint.max) == uint.min);
assert(saturated!"-"(42u, uint.min) == 42u);
assert(saturated!"-"(42u, uint.max) == uint.min);
assert(saturated!"-"(uint.max, uint.min) == uint.max);
assert(saturated!"-"(uint.max, 42u) == uint.max - 42u);
assert(saturated!"-"(uint.max, uint.max) == 0);

Meta