feat(api): make ImVec2/ImVec4 math operations immutable (#317)
resolves #302 Updated math operations (`plus`, `minus`, `times`, `div`) for `ImVec2` and `ImVec4` to return new instances instead of modifying the existing ones, ensuring immutability.
This commit is contained in:
1 parent
02691fdabe
commit
d27e3aa10b
6 files changed
+147
-65
No files matched your search
@@ -31,9 +31,7 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 plus(final float x, final float y) {
|
||||
this.x += x;
|
||||
this.y += y;
|
||||
return this;
|
||||
return new ImVec2(this.x + x, this.y + y);
|
||||
}
|
||||
|
||||
public ImVec2 plus(final ImVec2 value) {
|
||||
@@ -41,9 +39,7 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 minus(final float x, final float y) {
|
||||
this.x -= x;
|
||||
this.y -= y;
|
||||
return this;
|
||||
return new ImVec2(this.x - x, this.y -y);
|
||||
}
|
||||
|
||||
public ImVec2 minus(final ImVec2 value) {
|
||||
@@ -51,15 +47,21 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 times(final float x, final float y) {
|
||||
this.x *= x;
|
||||
this.y *= y;
|
||||
return this;
|
||||
return new ImVec2(this.x * x, this.y * y);
|
||||
}
|
||||
|
||||
public ImVec2 times(final ImVec2 value) {
|
||||
return times(value.x, value.y);
|
||||
}
|
||||
|
||||
public ImVec2 div(final float x, final float y) {
|
||||
return new ImVec2(this.x / x, this.y / y);
|
||||
}
|
||||
|
||||
public ImVec2 div(final ImVec2 value) {
|
||||
return div(value.x, value.y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ImVec2{"
|
||||
|
||||
@@ -35,11 +35,7 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 plus(final float x, final float y, final float z, final float w) {
|
||||
this.x += x;
|
||||
this.y += y;
|
||||
this.z += z;
|
||||
this.w += w;
|
||||
return this;
|
||||
return new ImVec4(this.x + x, this.y + y, this.z + z, this.w + w);
|
||||
}
|
||||
|
||||
public ImVec4 plus(final ImVec4 value) {
|
||||
@@ -47,11 +43,7 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 minus(final float x, final float y, final float z, final float w) {
|
||||
this.x -= x;
|
||||
this.y -= y;
|
||||
this.z -= z;
|
||||
this.w -= w;
|
||||
return this;
|
||||
return new ImVec4(this.x - x, this.y - y, this.z - z, this.w - w);
|
||||
}
|
||||
|
||||
public ImVec4 minus(final ImVec4 value) {
|
||||
@@ -59,17 +51,21 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 times(final float x, final float y, final float z, final float w) {
|
||||
this.x *= x;
|
||||
this.y *= y;
|
||||
this.z *= z;
|
||||
this.w *= w;
|
||||
return this;
|
||||
return new ImVec4(this.x * x, this.y * y, this.z * z, this.w * w);
|
||||
}
|
||||
|
||||
public ImVec4 times(final ImVec4 value) {
|
||||
return times(value.x, value.y, value.z, value.w);
|
||||
}
|
||||
|
||||
public ImVec4 div(final float x, final float y, final float z, final float w) {
|
||||
return new ImVec4(this.x / x, this.y / y, this.z / z, this.w / w);
|
||||
}
|
||||
|
||||
public ImVec4 div(final ImVec4 value) {
|
||||
return div(value.x, value.y, value.z, value.w);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ImVec4{"
|
||||
|
||||
@@ -31,9 +31,7 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 plus(final float x, final float y) {
|
||||
this.x += x;
|
||||
this.y += y;
|
||||
return this;
|
||||
return new ImVec2(this.x + x, this.y + y);
|
||||
}
|
||||
|
||||
public ImVec2 plus(final ImVec2 value) {
|
||||
@@ -41,9 +39,7 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 minus(final float x, final float y) {
|
||||
this.x -= x;
|
||||
this.y -= y;
|
||||
return this;
|
||||
return new ImVec2(this.x - x, this.y -y);
|
||||
}
|
||||
|
||||
public ImVec2 minus(final ImVec2 value) {
|
||||
@@ -51,15 +47,21 @@ public final class ImVec2 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec2 times(final float x, final float y) {
|
||||
this.x *= x;
|
||||
this.y *= y;
|
||||
return this;
|
||||
return new ImVec2(this.x * x, this.y * y);
|
||||
}
|
||||
|
||||
public ImVec2 times(final ImVec2 value) {
|
||||
return times(value.x, value.y);
|
||||
}
|
||||
|
||||
public ImVec2 div(final float x, final float y) {
|
||||
return new ImVec2(this.x / x, this.y / y);
|
||||
}
|
||||
|
||||
public ImVec2 div(final ImVec2 value) {
|
||||
return div(value.x, value.y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ImVec2{"
|
||||
|
||||
@@ -35,11 +35,7 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 plus(final float x, final float y, final float z, final float w) {
|
||||
this.x += x;
|
||||
this.y += y;
|
||||
this.z += z;
|
||||
this.w += w;
|
||||
return this;
|
||||
return new ImVec4(this.x + x, this.y + y, this.z + z, this.w + w);
|
||||
}
|
||||
|
||||
public ImVec4 plus(final ImVec4 value) {
|
||||
@@ -47,11 +43,7 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 minus(final float x, final float y, final float z, final float w) {
|
||||
this.x -= x;
|
||||
this.y -= y;
|
||||
this.z -= z;
|
||||
this.w -= w;
|
||||
return this;
|
||||
return new ImVec4(this.x - x, this.y - y, this.z - z, this.w - w);
|
||||
}
|
||||
|
||||
public ImVec4 minus(final ImVec4 value) {
|
||||
@@ -59,17 +51,21 @@ public final class ImVec4 implements Cloneable {
|
||||
}
|
||||
|
||||
public ImVec4 times(final float x, final float y, final float z, final float w) {
|
||||
this.x *= x;
|
||||
this.y *= y;
|
||||
this.z *= z;
|
||||
this.w *= w;
|
||||
return this;
|
||||
return new ImVec4(this.x * x, this.y * y, this.z * z, this.w * w);
|
||||
}
|
||||
|
||||
public ImVec4 times(final ImVec4 value) {
|
||||
return times(value.x, value.y, value.z, value.w);
|
||||
}
|
||||
|
||||
public ImVec4 div(final float x, final float y, final float z, final float w) {
|
||||
return new ImVec4(this.x / x, this.y / y, this.z / z, this.w / w);
|
||||
}
|
||||
|
||||
public ImVec4 div(final ImVec4 value) {
|
||||
return div(value.x, value.y, value.z, value.w);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ImVec4{"
|
||||
|
||||
@@ -4,6 +4,8 @@ import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotSame;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
|
||||
class ImVec2Test {
|
||||
@Nested
|
||||
@@ -34,16 +36,20 @@ class ImVec2Test {
|
||||
class set {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec2 value = new ImVec2().set(1, 2);
|
||||
final ImVec2 original = new ImVec2();
|
||||
final ImVec2 value = original.set(1, 2);
|
||||
assertEquals(1, value.x);
|
||||
assertEquals(2, value.y);
|
||||
assertSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec2() {
|
||||
final ImVec2 value = new ImVec2().set(new ImVec2(1, 2));
|
||||
final ImVec2 original = new ImVec2();
|
||||
final ImVec2 value = original.set(new ImVec2(1, 2));
|
||||
assertEquals(1, value.x);
|
||||
assertEquals(2, value.y);
|
||||
assertSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,16 +57,20 @@ class ImVec2Test {
|
||||
class plus {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec2 value = new ImVec2(5, 5).plus(1, 2);
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.plus(1, 2);
|
||||
assertEquals(6, value.x);
|
||||
assertEquals(7, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec2() {
|
||||
final ImVec2 value = new ImVec2(5, 5).plus(new ImVec2(1, 2));
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.plus(new ImVec2(1, 2));
|
||||
assertEquals(6, value.x);
|
||||
assertEquals(7, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,16 +78,20 @@ class ImVec2Test {
|
||||
class minus {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec2 value = new ImVec2(5, 5).minus(1, 2);
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.minus(1, 2);
|
||||
assertEquals(4, value.x);
|
||||
assertEquals(3, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec2() {
|
||||
final ImVec2 value = new ImVec2(5, 5).minus(new ImVec2(1, 2));
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.minus(new ImVec2(1, 2));
|
||||
assertEquals(4, value.x);
|
||||
assertEquals(3, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,16 +99,41 @@ class ImVec2Test {
|
||||
class times {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec2 value = new ImVec2(5, 5).times(1, 2);
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.times(1, 2);
|
||||
assertEquals(5, value.x);
|
||||
assertEquals(10, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec2() {
|
||||
final ImVec2 value = new ImVec2(5, 5).times(new ImVec2(1, 2));
|
||||
final ImVec2 original = new ImVec2(5, 5);
|
||||
final ImVec2 value = original.times(new ImVec2(1, 2));
|
||||
assertEquals(5, value.x);
|
||||
assertEquals(10, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class div {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec2 original = new ImVec2(10, 10);
|
||||
final ImVec2 value = original.div(5, 2);
|
||||
assertEquals(2, value.x);
|
||||
assertEquals(5, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec2() {
|
||||
final ImVec2 original = new ImVec2(10, 10);
|
||||
final ImVec2 value = original.div(new ImVec2(5, 2));
|
||||
assertEquals(2, value.x);
|
||||
assertEquals(5, value.y);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import org.junit.jupiter.api.Nested;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotSame;
|
||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||
|
||||
class ImVec4Test {
|
||||
@Nested
|
||||
@@ -27,7 +29,7 @@ class ImVec4Test {
|
||||
}
|
||||
|
||||
@Test
|
||||
void fromImVec2() {
|
||||
void fromImVec4() {
|
||||
final ImVec4 value = new ImVec4(new ImVec4(1, 2, 3, 4));
|
||||
assertEquals(1, value.x);
|
||||
assertEquals(2, value.y);
|
||||
@@ -40,20 +42,24 @@ class ImVec4Test {
|
||||
class set {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec4 value = new ImVec4().set(1, 2, 3, 4);
|
||||
final ImVec4 original = new ImVec4(1, 2, 3, 4);
|
||||
final ImVec4 value = original.set(1, 2, 3, 4);
|
||||
assertEquals(1, value.x);
|
||||
assertEquals(2, value.y);
|
||||
assertEquals(3, value.z);
|
||||
assertEquals(4, value.w);
|
||||
assertSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec4() {
|
||||
final ImVec4 value = new ImVec4().set(new ImVec4(1, 2, 3, 4));
|
||||
final ImVec4 original = new ImVec4(1, 2, 3, 4);
|
||||
final ImVec4 value = original.set(new ImVec4(1, 2, 3, 4));
|
||||
assertEquals(1, value.x);
|
||||
assertEquals(2, value.y);
|
||||
assertEquals(3, value.z);
|
||||
assertEquals(4, value.w);
|
||||
assertSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,16 +67,24 @@ class ImVec4Test {
|
||||
class plus {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).plus(1, 2, 3, 4);
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.plus(1, 2, 3, 4);
|
||||
assertEquals(6, value.x);
|
||||
assertEquals(7, value.y);
|
||||
assertEquals(8, value.z);
|
||||
assertEquals(9, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec4() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).plus(new ImVec4(1, 2, 3, 4));
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.plus(new ImVec4(1, 2, 3, 4));
|
||||
assertEquals(6, value.x);
|
||||
assertEquals(7, value.y);
|
||||
assertEquals(8, value.z);
|
||||
assertEquals(9, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,20 +92,24 @@ class ImVec4Test {
|
||||
class minus {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).minus(1, 2, 3, 4);
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.minus(1, 2, 3, 4);
|
||||
assertEquals(4, value.x);
|
||||
assertEquals(3, value.y);
|
||||
assertEquals(2, value.z);
|
||||
assertEquals(1, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec4() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).minus(new ImVec4(1, 2, 3, 4));
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.minus(new ImVec4(1, 2, 3, 4));
|
||||
assertEquals(4, value.x);
|
||||
assertEquals(3, value.y);
|
||||
assertEquals(2, value.z);
|
||||
assertEquals(1, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,20 +117,49 @@ class ImVec4Test {
|
||||
class times {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).times(1, 2, 3, 4);
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.times(1, 2, 3, 4);
|
||||
assertEquals(5, value.x);
|
||||
assertEquals(10, value.y);
|
||||
assertEquals(15, value.z);
|
||||
assertEquals(20, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec4() {
|
||||
final ImVec4 value = new ImVec4(5, 5, 5, 5).times(new ImVec4(1, 2, 3, 4));
|
||||
final ImVec4 original = new ImVec4(5, 5, 5, 5);
|
||||
final ImVec4 value = original.times(new ImVec4(1, 2, 3, 4));
|
||||
assertEquals(5, value.x);
|
||||
assertEquals(10, value.y);
|
||||
assertEquals(15, value.z);
|
||||
assertEquals(20, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class div {
|
||||
@Test
|
||||
void withFloats() {
|
||||
final ImVec4 original = new ImVec4(10, 10, 15, 15);
|
||||
final ImVec4 value = original.div(5, 2, 3, 5);
|
||||
assertEquals(2, value.x);
|
||||
assertEquals(5, value.y);
|
||||
assertEquals(5, value.z);
|
||||
assertEquals(3, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
void withImVec4() {
|
||||
final ImVec4 original = new ImVec4(10, 10, 15, 15);
|
||||
final ImVec4 value = original.div(new ImVec4(5, 2, 3, 5));
|
||||
assertEquals(2, value.x);
|
||||
assertEquals(5, value.y);
|
||||
assertEquals(5, value.z);
|
||||
assertEquals(3, value.w);
|
||||
assertNotSame(original, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user