diff --git a/src/ripple/basics/Number.h b/src/ripple/basics/Number.h index 50975e7d0..3832a8495 100644 --- a/src/ripple/basics/Number.h +++ b/src/ripple/basics/Number.h @@ -325,6 +325,16 @@ root(Number f, unsigned d); Number power(Number f, unsigned n, unsigned d); +// Return 0 if abs(x) < limit, else returns x + +inline constexpr Number +clip(Number const& x, Number const& limit) noexcept +{ + if (abs(x) < limit) + return Number{}; + return x; +} + } // namespace ripple #endif // RIPPLE_BASICS_NUMBER_H_INCLUDED diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 444095bfb..43a8884c5 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -129,6 +129,7 @@ public: void test_to_integer() { + testcase("test_to_integer"); Number x[]{ Number{0}, Number{1}, @@ -195,6 +196,19 @@ public: } } + void + test_clip() + { + testcase("test_clip"); + Number limit{1, -6}; + BEAST_EXPECT((clip(Number{2, -6}, limit) == Number{2, -6})); + BEAST_EXPECT((clip(Number{1, -6}, limit) == Number{1, -6})); + BEAST_EXPECT((clip(Number{9, -7}, limit) == Number{0})); + BEAST_EXPECT((clip(Number{-2, -6}, limit) == Number{-2, -6})); + BEAST_EXPECT((clip(Number{-1, -6}, limit) == Number{-1, -6})); + BEAST_EXPECT((clip(Number{-9, -7}, limit) == Number{0})); + } + void run() override { @@ -205,6 +219,7 @@ public: test_root(); testConversions(); test_to_integer(); + test_clip(); } };