Skip to content
This repository was archived by the owner on Jun 11, 2026. It is now read-only.

Commit 96e213b

Browse files
committed
implement strictly enforced hashCode() and equals() implementation
1 parent 09efcf2 commit 96e213b

1 file changed

Lines changed: 25 additions & 17 deletions

File tree

src/main/java/org/comroid/api/data/Vector.java

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import jakarta.persistence.AttributeConverter;
44
import lombok.AccessLevel;
55
import lombok.Data;
6-
import lombok.EqualsAndHashCode;
76
import lombok.Getter;
87
import lombok.NoArgsConstructor;
98
import lombok.Setter;
@@ -15,6 +14,7 @@
1514

1615
import java.nio.ByteBuffer;
1716
import java.util.Arrays;
17+
import java.util.Objects;
1818
import java.util.function.BiFunction;
1919
import java.util.function.DoubleUnaryOperator;
2020
import java.util.stream.DoubleStream;
@@ -42,15 +42,12 @@ static Vector units(int n, double length) {
4242
}
4343

4444
static Vector of(double... dim) {
45-
switch (dim.length) {
46-
case 2:
47-
return new N2(dim[0], dim[1]);
48-
case 3:
49-
return new N3(dim[0], dim[1], dim[2]);
50-
case 4:
51-
return new N4(dim[0], dim[1], dim[2], dim[3]);
52-
}
53-
throw outOfBounds(dim.length);
45+
return switch (dim.length) {
46+
case 2 -> new N2(dim[0], dim[1]);
47+
case 3 -> new N3(dim[0], dim[1], dim[2]);
48+
case 4 -> new N4(dim[0], dim[1], dim[2], dim[3]);
49+
default -> throw outOfBounds(dim.length);
50+
};
5451
}
5552

5653
static Vector min(Vector a, Vector b) {
@@ -73,8 +70,8 @@ static double dist(Vector a, Vector b) {
7370
Vector min = min(a, b), max = max(a, b);
7471
var acc = 0.0;
7572
for (var i = 0; i < a.n(); i++)
76-
acc += Math.pow(max.get(i) - min.get(i), 2);
77-
return Math.sqrt(acc);
73+
acc += pow(max.get(i) - min.get(i), 2);
74+
return sqrt(acc);
7875
}
7976

8077
double getX();
@@ -264,7 +261,6 @@ private static UnsupportedOperationException outOfBounds(int n) {
264261

265262
@Data
266263
@NoArgsConstructor
267-
@EqualsAndHashCode(of = { "x", "y" })
268264
@FieldDefaults(level = AccessLevel.PROTECTED)
269265
class N2 implements Vector {
270266
public static final N2 Zero = new N2();
@@ -311,12 +307,26 @@ public Vector.N2 ctor(double... dim) {
311307
return new N2(dim[0], dim[1]);
312308
}
313309

310+
@Override
311+
public final int hashCode() {
312+
return Objects.hash((Object[]) stream().boxed().toArray(Double[]::new));
313+
}
314+
315+
@Override
316+
public final boolean equals(Object o) {
317+
if (!(o instanceof Vector ov)) return false;
318+
double[] it = toArray(), ot = ov.toArray();
319+
var eq = 0;
320+
for (var i = 0; i < n(); i++) if (abs(Double.compare(it[i], ot[i])) < 0.000_01) eq++;
321+
return eq == n();
322+
}
323+
314324
@Override
315325
public final String toString() {
316326
final var dims = new char[]{ 'x', 'y', 'z', 'w' };
317-
var ls = "(";
327+
var ls = new StringBuilder("(");
318328
for (var n = 0; n < n(); n++)
319-
ls += "" + dims[n] + '=' + get(n) + ';';
329+
ls.append(dims[n]).append('=').append(get(n)).append(';');
320330
return ls.substring(0, ls.length() - 1) + ')';
321331
}
322332

@@ -329,7 +339,6 @@ public N3 to3(double z) {
329339
@Getter
330340
@NoArgsConstructor
331341
@FieldDefaults(level = AccessLevel.PROTECTED)
332-
@EqualsAndHashCode(of = "z", callSuper = true)
333342
class N3 extends N2 {
334343
public static final N3 Zero = new N3();
335344
public static final N3 One = new N3(1, 1, 1);
@@ -388,7 +397,6 @@ public N3 convertToEntityAttribute(byte[] dbData) {
388397
@Getter
389398
@NoArgsConstructor
390399
@FieldDefaults(level = AccessLevel.PROTECTED)
391-
@EqualsAndHashCode(of = "w", callSuper = true)
392400
class N4 extends N3 {
393401
public static final N4 Zero = new N4();
394402
public static final N4 One = new N4(1, 1, 1, 1);

0 commit comments

Comments
 (0)