This is an automated email from the ASF dual-hosted git repository.

toulmean pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git


The following commit(s) were added to refs/heads/master by this push:
     new 1487d61  Fixes to bytes, unsigned ints. Added convenience methods 
(plus, mod0, divideCeil) for uints
1487d61 is described below

commit 1487d6112bef0eea9cfa1c18afddbe1aae0f4489
Author: Antoine Toulme <[email protected]>
AuthorDate: Sat Nov 30 00:43:23 2019 -0800

    Fixes to bytes, unsigned ints. Added convenience methods (plus, mod0, 
divideCeil) for uints
---
 .../main/java/org/apache/tuweni/bytes/Bytes32.java |  3 --
 .../tuweni/units/bigints/BaseUInt256Value.java     | 31 ++++++++++++
 .../org/apache/tuweni/units/bigints/UInt256.java   | 35 +++++++++++++
 .../apache/tuweni/units/bigints/UInt256Value.java  | 58 ++++++++++++++++++++++
 .../tuweni/units/bigints/BaseUInt256ValueTest.java | 24 +++++++++
 .../apache/tuweni/units/bigints/UInt256Test.java   | 56 +++++++++++++++++++++
 6 files changed, 204 insertions(+), 3 deletions(-)

diff --git a/bytes/src/main/java/org/apache/tuweni/bytes/Bytes32.java 
b/bytes/src/main/java/org/apache/tuweni/bytes/Bytes32.java
index c0cc80b..7d63fd7 100644
--- a/bytes/src/main/java/org/apache/tuweni/bytes/Bytes32.java
+++ b/bytes/src/main/java/org/apache/tuweni/bytes/Bytes32.java
@@ -104,9 +104,6 @@ public interface Bytes32 extends Bytes {
    */
   static Bytes32 wrap(Bytes value, int offset) {
     checkNotNull(value);
-    if (value instanceof Bytes32) {
-      return (Bytes32) value;
-    }
     Bytes slice = value.slice(offset, Bytes32.SIZE);
     if (slice instanceof Bytes32) {
       return (Bytes32) slice;
diff --git 
a/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java 
b/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
index 208db08..490434d 100644
--- a/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
+++ b/units/src/main/java/org/apache/tuweni/units/bigints/BaseUInt256Value.java
@@ -261,6 +261,27 @@ public abstract class BaseUInt256Value<T extends 
UInt256Value<T>> implements UIn
   }
 
   @Override
+  public T divideCeil(T value) {
+    return divideCeil(value.toUInt256());
+  }
+
+  /**
+   * Returns a value that is {@code (this / value)}.
+   *
+   * @param value The amount to divide this value by.
+   * @return {@code this / value}
+   * @throws ArithmeticException {@code value} == 0.
+   */
+  public T divideCeil(UInt256 value) {
+    return ctor.apply(this.value.divideCeil(value));
+  }
+
+  @Override
+  public T divideCeil(long value) {
+    return ctor.apply(this.value.divideCeil(value));
+  }
+
+  @Override
   public T pow(UInt256 exponent) {
     return ctor.apply(this.value.pow(exponent));
   }
@@ -281,6 +302,16 @@ public abstract class BaseUInt256Value<T extends 
UInt256Value<T>> implements UIn
   }
 
   @Override
+  public T mod0(UInt256 modulus) {
+    return ctor.apply(this.value.mod0(modulus));
+  }
+
+  @Override
+  public T mod0(long modulus) {
+    return ctor.apply(this.value.mod0(modulus));
+  }
+
+  @Override
   public int compareTo(T other) {
     return compareTo(other.toUInt256());
   }
diff --git a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java 
b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
index 57799a1..eb0899f 100644
--- a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
+++ b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256.java
@@ -266,6 +266,9 @@ public final class UInt256 implements UInt256Value<UInt256> 
{
     if (value.equals(UInt256.ONE)) {
       return this;
     }
+    if (this.equals(UInt256.ONE)) {
+      return value;
+    }
     return multiply(this.ints, value.ints);
   }
 
@@ -313,6 +316,9 @@ public final class UInt256 implements UInt256Value<UInt256> 
{
       throw new ArithmeticException("multiply unsigned by negative");
     }
     UInt256 other = new UInt256(value);
+    if (this.equals(UInt256.ONE)) {
+      return other;
+    }
     return multiply(this.ints, other.ints);
   }
 
@@ -396,6 +402,16 @@ public final class UInt256 implements 
UInt256Value<UInt256> {
   }
 
   @Override
+  public UInt256 divideCeil(UInt256 value) {
+    return this.divide(value).add(this.mod(value).isZero() ? 0 : 1);
+  }
+
+  @Override
+  public UInt256 divideCeil(long value) {
+    return this.divide(value).add(this.mod(value).isZero() ? 0 : 1);
+  }
+
+  @Override
   public UInt256 pow(UInt256 exponent) {
     return UInt256.valueOf(toBigInteger().modPow(exponent.toBigInteger(), 
P_2_256));
   }
@@ -438,6 +454,25 @@ public final class UInt256 implements 
UInt256Value<UInt256> {
     return UInt256.valueOf(toBigInteger().mod(BigInteger.valueOf(modulus)));
   }
 
+  @Override
+  public UInt256 mod0(UInt256 modulus) {
+    if (modulus.equals(UInt256.ZERO)) {
+      return UInt256.ZERO;
+    }
+    return mod(modulus);
+  }
+
+  @Override
+  public UInt256 mod0(long modulus) {
+    if (modulus == 0) {
+      return UInt256.ZERO;
+    }
+    if (modulus < 0) {
+      throw new ArithmeticException("mod by negative");
+    }
+    return mod(modulus);
+  }
+
   /**
    * Return a bit-wise AND of this value and the supplied value.
    *
diff --git 
a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256Value.java 
b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256Value.java
index af993cc..6f15d15 100644
--- a/units/src/main/java/org/apache/tuweni/units/bigints/UInt256Value.java
+++ b/units/src/main/java/org/apache/tuweni/units/bigints/UInt256Value.java
@@ -59,6 +59,30 @@ public interface UInt256Value<T extends UInt256Value<T>> 
extends Comparable<T> {
   /**
    * Returns a value that is {@code (this + value)}.
    *
+   * <p>This notation can be used in Kotlin with the {@code +} operator.
+   *
+   * @param value The amount to be added to this value.
+   * @return {@code this + value}
+   */
+  default T plus(T value) {
+    return add(value);
+  }
+
+  /**
+   * Returns a value that is {@code (this + value)}.
+   *
+   * <p>This notation can be used in Kotlin with the {@code +} operator.
+   *
+   * @param value The amount to be added to this value.
+   * @return {@code this + value}
+   */
+  default T plus(long value) {
+    return add(value);
+  }
+
+  /**
+   * Returns a value that is {@code (this + value)}.
+   *
    * @param value the amount to be added to this value
    * @return {@code this + value}
    * @throws ArithmeticException if the result of the addition overflows
@@ -236,6 +260,24 @@ public interface UInt256Value<T extends UInt256Value<T>> 
extends Comparable<T> {
   T divide(long value);
 
   /**
+   * Returns a value that is {@code ceiling(this / value)}.
+   *
+   * @param value The amount to divide this value by.
+   * @return {@code this / value + ( this % value == 0 ? 0 : 1)}
+   * @throws ArithmeticException {@code value} == 0.
+   */
+  T divideCeil(T value);
+
+  /**
+   * Returns a value that is {@code ceiling(this / value)}.
+   *
+   * @param value The amount to divide this value by.
+   * @return {@code this / value + ( this % value == 0 ? 0 : 1)}
+   * @throws ArithmeticException {@code value} == 0.
+   */
+  T divideCeil(long value);
+
+  /**
    * Returns a value that is {@code (this<sup>exponent</sup> mod 
2<sup>256</sup>)}
    *
    * <p>
@@ -279,6 +321,22 @@ public interface UInt256Value<T extends UInt256Value<T>> 
extends Comparable<T> {
   T mod(long modulus);
 
   /**
+   * Returns a value that is {@code (this mod modulus)}, or 0 if modulus is 0.
+   *
+   * @param modulus The modulus.
+   * @return {@code this mod modulus}.
+   */
+  T mod0(UInt256 modulus);
+
+  /**
+   * Returns a value that is {@code (this mod modulus)}, or 0 if modulus is 0.
+   *
+   * @param modulus The modulus.
+   * @return {@code this mod modulus}.
+   */
+  T mod0(long modulus);
+
+  /**
    * @return True if this value fits a java {@code int} (i.e. is less or equal 
to {@code Integer.MAX_VALUE}).
    */
   default boolean fitsInt() {
diff --git 
a/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java 
b/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
index b00c464..bec3bb9 100644
--- 
a/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
+++ 
b/units/src/test/java/org/apache/tuweni/units/bigints/BaseUInt256ValueTest.java
@@ -306,6 +306,12 @@ class BaseUInt256ValueTest {
 
   private static Stream<Arguments> multiplyProvider() {
     return Stream.of(
+        Arguments.of(v(0), v(1), v(0)),
+        Arguments.of(v(1), v(0), v(0)),
+        Arguments.of(v(1), v(20), v(20)),
+        Arguments.of(v(20), v(1), v(20)),
+        Arguments.of(hv("0x0a0000000000"), v(1), hv("0x0a0000000000")),
+        Arguments.of(v(1), hv("0x0a0000000000"), hv("0x0a0000000000")),
         Arguments.of(v(0), v(2), v(0)),
         Arguments.of(v(1), v(2), v(2)),
         Arguments.of(v(2), v(2), v(4)),
@@ -332,6 +338,13 @@ class BaseUInt256ValueTest {
 
   private static Stream<Arguments> multiplyUInt256Provider() {
     return Stream.of(
+        Arguments.of(v(0), UInt256.valueOf(1), v(0)),
+        Arguments.of(v(1), UInt256.valueOf(0), v(0)),
+        Arguments.of(v(1), UInt256.valueOf(20), v(20)),
+        Arguments.of(v(20), UInt256.valueOf(1), v(20)),
+
+        Arguments.of(hv("0x0a0000000000"), UInt256.valueOf(1), 
hv("0x0a0000000000")),
+        Arguments.of(v(1), UInt256.fromHexString("0x0a0000000000"), 
hv("0x0a0000000000")),
         Arguments.of(v(0), UInt256.valueOf(2), v(0)),
         Arguments.of(v(1), UInt256.valueOf(2), v(2)),
         Arguments.of(v(2), UInt256.valueOf(2), v(4)),
@@ -370,6 +383,12 @@ class BaseUInt256ValueTest {
 
   private static Stream<Arguments> multiplyLongProvider() {
     return Stream.of(
+        Arguments.of(v(0), 1L, v(0)),
+        Arguments.of(v(1), 0L, v(0)),
+        Arguments.of(v(1), 20L, v(20)),
+        Arguments.of(v(20), 1L, v(20)),
+        Arguments.of(hv("0x0a0000000000"), 1L, hv("0x0a0000000000")),
+        Arguments.of(v(1), 10995116277760L, hv("0x0a0000000000")),
         Arguments.of(v(0), 2L, v(0)),
         Arguments.of(v(1), 2L, v(2)),
         Arguments.of(v(2), 2L, v(4)),
@@ -735,6 +754,11 @@ class BaseUInt256ValueTest {
   }
 
   @Test
+  void shouldReturnZeroForMod0LongByZero() {
+    assertEquals(UInt256.ZERO, v(5).mod0(0).toUInt256());
+  }
+
+  @Test
   void shouldThrowForModLongByNegative() {
     Throwable exception = assertThrows(ArithmeticException.class, () -> 
v(5).mod(-5));
     assertEquals("mod by negative", exception.getMessage());
diff --git 
a/units/src/test/java/org/apache/tuweni/units/bigints/UInt256Test.java 
b/units/src/test/java/org/apache/tuweni/units/bigints/UInt256Test.java
index 36eb1d1..80a334b 100644
--- a/units/src/test/java/org/apache/tuweni/units/bigints/UInt256Test.java
+++ b/units/src/test/java/org/apache/tuweni/units/bigints/UInt256Test.java
@@ -248,6 +248,11 @@ class UInt256Test {
 
   private static Stream<Arguments> multiplyProvider() {
     return Stream.of(
+        Arguments.of(v(0), v(1), v(0)),
+        Arguments.of(v(1), v(0), v(0)),
+        Arguments.of(v(1), v(20), v(20)),
+        Arguments.of(hv("0x0a0000000000"), v(1), hv("0x0a0000000000")),
+        Arguments.of(v(1), hv("0x0a0000000000"), hv("0x0a0000000000")),
         Arguments.of(v(0), v(2), v(0)),
         Arguments.of(v(1), v(2), v(2)),
         Arguments.of(v(2), v(2), v(4)),
@@ -274,6 +279,12 @@ class UInt256Test {
 
   private static Stream<Arguments> multiplyLongProvider() {
     return Stream.of(
+        Arguments.of(v(0), 1L, v(0)),
+        Arguments.of(v(1), 0L, v(0)),
+        Arguments.of(v(1), 20L, v(20)),
+        Arguments.of(v(20), 1L, v(20)),
+        Arguments.of(hv("0x0a0000000000"), v(1), hv("0x0a0000000000")),
+        Arguments.of(v(1), hv("0x0a0000000000"), hv("0x0a0000000000")),
         Arguments.of(v(0), 2L, v(0)),
         Arguments.of(v(1), 2L, v(2)),
         Arguments.of(v(2), 2L, v(4)),
@@ -434,6 +445,40 @@ class UInt256Test {
   }
 
   @ParameterizedTest
+  @MethodSource("divideCeilProvider")
+  void divideCeil(UInt256 v1, UInt256 v2, UInt256 expected) {
+    assertValueEquals(expected, v1.divideCeil(v2));
+  }
+
+  private static Stream<Arguments> divideCeilProvider() {
+    return Stream.of(
+        Arguments.of(v(0), v(2), v(0)),
+        Arguments.of(v(1), v(2), v(1)),
+        Arguments.of(v(2), v(2), v(1)),
+        Arguments.of(v(3), v(2), v(2)),
+        Arguments.of(v(4), v(2), v(2)),
+        Arguments.of(biv("13492324908428420834234908341"), v(2), 
biv("6746162454214210417117454171")),
+        Arguments.of(biv("13492324908428420834234908342"), v(2), 
biv("6746162454214210417117454171")),
+        Arguments.of(biv("13492324908428420834234908343"), v(2), 
biv("6746162454214210417117454172")),
+        Arguments.of(v(2), v(8), v(1)),
+        Arguments.of(v(7), v(8), v(1)),
+        Arguments.of(v(8), v(8), v(1)),
+        Arguments.of(v(9), v(8), v(2)),
+        Arguments.of(v(17), v(8), v(3)),
+        Arguments.of(v(1024), v(8), v(128)),
+        Arguments.of(v(1026), v(8), v(129)),
+        Arguments.of(biv("13492324908428420834234908342"), v(8), 
biv("1686540613553552604279363543")),
+        Arguments.of(biv("13492324908428420834234908342"), v(2048), 
biv("6588049271693564860466264")),
+        Arguments.of(biv("13492324908428420834234908342"), v(131072), 
biv("102938269870211950944786")));
+  }
+
+  @Test
+  void shouldThrowForDivideCeilByZero() {
+    Throwable exception = assertThrows(ArithmeticException.class, () -> 
v(5).divideCeil(v(0)));
+    assertEquals("divide by zero", exception.getMessage());
+  }
+
+  @ParameterizedTest
   @MethodSource("divideLongProvider")
   void divideLong(UInt256 v1, long v2, UInt256 expected) {
     assertValueEquals(expected, v1.divide(v2));
@@ -550,6 +595,17 @@ class UInt256Test {
     assertEquals("mod by negative", exception.getMessage());
   }
 
+  @Test
+  void shouldReturnZeroForMod0LongByZero() {
+    assertEquals(UInt256.ZERO, v(5).mod0(0));
+  }
+
+  @Test
+  void shouldThrowForMod0LongByNegative() {
+    Throwable exception = assertThrows(ArithmeticException.class, () -> 
v(5).mod0(-5));
+    assertEquals("mod by negative", exception.getMessage());
+  }
+
   @ParameterizedTest
   @MethodSource("andProvider")
   void and(UInt256 v1, UInt256 v2, UInt256 expected) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to