From 756db579d92270ca7cce13f3eda8e4b17ac0039f Mon Sep 17 00:00:00 2001 From: Edoardo La Greca Date: Fri, 1 Aug 2025 17:11:19 +0200 Subject: turn SizedMessageField into SizedInteger --- src/main/kotlin/SizedInteger.kt | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/kotlin/SizedInteger.kt (limited to 'src/main/kotlin/SizedInteger.kt') diff --git a/src/main/kotlin/SizedInteger.kt b/src/main/kotlin/SizedInteger.kt new file mode 100644 index 0000000..48e4e25 --- /dev/null +++ b/src/main/kotlin/SizedInteger.kt @@ -0,0 +1,36 @@ +import java.math.BigInteger + +/** + * [SizedInteger] represents an unsigned integer number of arbitrary yet fixed length. It's useful for storing integers + * got from a connection as message fields. + * + * @param size The size of the field, measured in bytes. + * @param value The value of the field. + * + * @throws IllegalArgumentException if the size required to store the provided value is bigger than the provided size. + */ +class SizedInteger(val size: ULong, value: BigInteger) { + init { + if (!this.sizeOk(size, value)) { + throw IllegalArgumentException() + } + } + + constructor(size: ULong) : this(size, 0.toBigInteger()) + + /** + * @throws IllegalStateException on set if the declared size is not enough for the new value. + */ + var value = value + set(value) { + if (!this.sizeOk(value)) { + throw IllegalStateException() + } + } + + private fun sizeOk(size: ULong, value: BigInteger): Boolean { + val requiredSize = value.toByteArray().size.toUInt() + return requiredSize <= size + } + private fun sizeOk(value: BigInteger): Boolean = sizeOk(this.size, value) +} \ No newline at end of file -- cgit v1.2.3