33import jakarta .persistence .AttributeConverter ;
44import lombok .AccessLevel ;
55import lombok .Data ;
6- import lombok .EqualsAndHashCode ;
76import lombok .Getter ;
87import lombok .NoArgsConstructor ;
98import lombok .Setter ;
1514
1615import java .nio .ByteBuffer ;
1716import java .util .Arrays ;
17+ import java .util .Objects ;
1818import java .util .function .BiFunction ;
1919import java .util .function .DoubleUnaryOperator ;
2020import 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