Skip to content

Commit 328d260

Browse files
committed
splitted Interval into Empty and NonEmpty to get rid of meaningless begin and end in empty intervals
1 parent b355e11 commit 328d260

File tree

8 files changed

+146
-65
lines changed

8 files changed

+146
-65
lines changed

src/main/java/net/itarray/automotion/internal/geometry/Interval.java

Lines changed: 113 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,63 +2,137 @@
22

33
import java.util.Objects;
44

5-
public class Interval {
6-
private final Scalar begin;
7-
private final Scalar end;
5+
public abstract class Interval {
86

9-
public Interval(Scalar begin, Scalar end) {
10-
this.begin = begin;
11-
this.end = end;
7+
private Interval() {
128
}
139

14-
@Override
15-
public String toString() {
16-
if (isEmpty()) {
17-
return format("-", "-");
10+
public static Interval interval(Scalar begin, Scalar end) {
11+
if (begin.isGreaterOrEqualTo(end)) {
12+
return new Empty();
1813
}
19-
return format(begin.toString(), end.toString());
14+
return new NonEmpty(begin, end);
2015
}
2116

22-
private String format(String begin, String end) {
17+
private static String format(String begin, String end) {
2318
return String.format("[%s, %s[", begin, end);
2419
}
2520

2621
@Override
27-
public boolean equals(Object object) {
28-
if (!(object instanceof Interval)) {
29-
return false;
22+
public abstract String toString();
23+
24+
@Override
25+
public abstract boolean equals(Object object);
26+
27+
@Override
28+
public abstract int hashCode();
29+
30+
public abstract boolean isEmpty();
31+
32+
public abstract Interval intersect(Interval interval);
33+
34+
public abstract Interval intersectWithNonEmpty(NonEmpty interval);
35+
36+
public abstract Interval span(Interval interval);
37+
38+
public abstract Interval spanWithNonEmpty(NonEmpty interval);
39+
40+
private static class Empty extends Interval {
41+
private Empty() {
3042
}
31-
Interval other = (Interval) object;
32-
if (isEmpty()) {
33-
return other.isEmpty();
43+
44+
@Override
45+
public String toString() {
46+
return format("-", "-");
3447
}
35-
return begin.equals(other.begin) && end.equals(other.end);
36-
}
3748

38-
@Override
39-
public int hashCode() {
40-
return isEmpty()? 0 : Objects.hash(begin, end);
41-
}
49+
@Override
50+
public int hashCode() {
51+
return 0;
52+
}
4253

43-
public boolean isEmpty() {
44-
return end.isLessOrEqualTo(begin);
45-
}
54+
@Override
55+
public boolean equals(Object object) {
56+
return object instanceof Empty;
57+
}
4658

47-
public Interval intersect(Interval interval) {
48-
return new Interval(
49-
begin.max(interval.begin),
50-
end.min(interval.end));
51-
}
59+
public boolean isEmpty() {
60+
return true;
61+
}
5262

53-
public Interval span(Interval interval) {
54-
if (isEmpty()) {
55-
return interval;
63+
public Interval intersect(Interval interval) {
64+
return this;
5665
}
57-
if (interval.isEmpty()) {
66+
67+
@Override
68+
public Interval intersectWithNonEmpty(NonEmpty interval) {
5869
return this;
5970
}
60-
return new Interval(
61-
begin.min(interval.begin),
62-
end.max(interval.end));
71+
72+
public Interval span(Interval interval) {
73+
return interval;
74+
}
75+
76+
@Override
77+
public Interval spanWithNonEmpty(NonEmpty interval) {
78+
return interval;
79+
}
80+
}
81+
82+
private static class NonEmpty extends Interval {
83+
private final Scalar begin;
84+
private final Scalar end;
85+
86+
private NonEmpty(Scalar begin, Scalar end) {
87+
this.begin = begin;
88+
this.end = end;
89+
}
90+
91+
@Override
92+
public String toString() {
93+
return format(begin.toString(), end.toString());
94+
}
95+
96+
@Override
97+
public int hashCode() {
98+
return Objects.hash(begin, end);
99+
}
100+
101+
@Override
102+
public boolean equals(Object object) {
103+
if (!(object instanceof NonEmpty)) {
104+
return false;
105+
}
106+
NonEmpty other = (NonEmpty) object;
107+
return begin.equals(other.begin) && end.equals(other.end);
108+
}
109+
110+
public boolean isEmpty() {
111+
return false;
112+
}
113+
114+
@Override
115+
public Interval intersect(Interval interval) {
116+
return interval.intersectWithNonEmpty(this);
117+
}
118+
119+
@Override
120+
public Interval intersectWithNonEmpty(NonEmpty interval) {
121+
return interval(
122+
begin.max(interval.begin),
123+
end.min(interval.end));
124+
}
125+
126+
@Override
127+
public Interval span(Interval interval) {
128+
return interval.spanWithNonEmpty(this);
129+
}
130+
131+
@Override
132+
public Interval spanWithNonEmpty(NonEmpty interval) {
133+
return interval(
134+
begin.min(interval.begin),
135+
end.max(interval.end));
136+
}
63137
}
64138
}

src/test/java/net/itarray/automotion/tests/geometry/ContainedIntervalsTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import org.junit.Test;
66

7+
import static net.itarray.automotion.internal.geometry.Interval.interval;
78
import static org.assertj.core.api.Assertions.assertThat;
89

910
public class ContainedIntervalsTest extends TwoIntervalsTest{
1011

1112
public Interval left() {
12-
return new Interval(new Scalar(12), new Scalar(15));
13+
return interval(new Scalar(12), new Scalar(15));
1314
}
1415

1516
public Interval right() {
16-
return new Interval(new Scalar(20), new Scalar(20));
17+
return interval(new Scalar(20), new Scalar(20));
1718
}
1819

1920
@Test

src/test/java/net/itarray/automotion/tests/geometry/DisjointIntervalsTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import org.junit.Test;
66

7+
import static net.itarray.automotion.internal.geometry.Interval.interval;
78
import static org.assertj.core.api.Assertions.assertThat;
89

910
public class DisjointIntervalsTest extends TwoIntervalsTest{
1011

1112
public Interval left() {
12-
return new Interval(new Scalar(2), new Scalar(8));
13+
return interval(new Scalar(2), new Scalar(8));
1314
}
1415

1516
public Interval right() {
16-
return new Interval(new Scalar(10), new Scalar(17));
17+
return interval(new Scalar(10), new Scalar(17));
1718
}
1819

1920
@Test
@@ -23,7 +24,7 @@ public void haveEmptyIntersection() {
2324

2425
@Test
2526
public void haveSpanFromSmallestBeginToLargestEnd() {
26-
Interval span = new Interval(new Scalar(2), new Scalar(17));
27+
Interval span = interval(new Scalar(2), new Scalar(17));
2728
assertThat(right().span(left())).isEqualTo(span);
2829
assertThat(left().span(right())).isEqualTo(span);
2930
}

src/test/java/net/itarray/automotion/tests/geometry/EmptyAndNonEmptyIntervalsTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,27 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import org.junit.Test;
66

7+
import static net.itarray.automotion.internal.geometry.Interval.interval;
78
import static org.assertj.core.api.Assertions.assertThat;
89

910
public class EmptyAndNonEmptyIntervalsTest extends TwoIntervalsTest{
1011

1112
public Interval left() {
12-
return new Interval(new Scalar(12), new Scalar(15));
13+
return interval(new Scalar(12), new Scalar(15));
1314
}
1415

1516
public Interval right() {
16-
return new Interval(new Scalar(10), new Scalar(17));
17+
return interval(new Scalar(10), new Scalar(17));
1718
}
1819

1920
@Test
2021
public void haveIntersectionBeginningAtLargerStartAndEndingAtSmallerEnd() {
21-
assertThat(right().intersect(left())).isEqualTo(new Interval(new Scalar(12), new Scalar(15)));
22+
assertThat(right().intersect(left())).isEqualTo(interval(new Scalar(12), new Scalar(15)));
2223
}
2324

2425
@Test
2526
public void haveSpanFromSmallestBeginToLargestEnd() {
26-
Interval span = new Interval(new Scalar(10), new Scalar(17));
27+
Interval span = interval(new Scalar(10), new Scalar(17));
2728
assertThat(right().span(left())).isEqualTo(span);
2829
assertThat(left().span(right())).isEqualTo(span);
2930
}

src/test/java/net/itarray/automotion/tests/geometry/EmptyIntervalTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.Before;
66
import org.junit.Test;
77

8+
import static net.itarray.automotion.internal.geometry.Interval.interval;
89
import static org.assertj.core.api.Assertions.assertThat;
910

1011
public class EmptyIntervalTest {
@@ -17,7 +18,7 @@ public class EmptyIntervalTest {
1718
public void setUp() {
1819
begin = new Scalar(17);
1920
end = new Scalar(10);
20-
interval = new Interval(begin, end);
21+
interval = interval(begin, end);
2122
}
2223

2324
@Test
@@ -27,13 +28,13 @@ public void isEmpty() {
2728

2829
@Test
2930
public void isEqualToIntervalsOtherEmptyIntervals() {
30-
assertThat(interval).isEqualTo(new Interval(new Scalar(100), new Scalar(99)));
31-
assertThat(interval.hashCode()).isEqualTo(new Interval(new Scalar(100), new Scalar(99)).hashCode());
31+
assertThat(interval).isEqualTo(interval(new Scalar(100), new Scalar(99)));
32+
assertThat(interval.hashCode()).isEqualTo(interval(new Scalar(100), new Scalar(99)).hashCode());
3233
}
3334

3435
@Test
3536
public void isNotEqualToNonEmptyIntervals() {
36-
assertThat(interval).isNotEqualTo(new Interval(new Scalar(10), new Scalar(20)));
37+
assertThat(interval).isNotEqualTo(interval(new Scalar(10), new Scalar(20)));
3738
}
3839

3940
}

src/test/java/net/itarray/automotion/tests/geometry/IntervalTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.Before;
66
import org.junit.Test;
77

8+
import static net.itarray.automotion.internal.geometry.Interval.interval;
89
import static org.assertj.core.api.Assertions.assertThat;
910

1011
public class IntervalTest {
@@ -17,23 +18,23 @@ public class IntervalTest {
1718
public void setUp() {
1819
begin = new Scalar(10);
1920
end = new Scalar(17);
20-
interval = new Interval(begin, end);
21+
interval = interval(begin, end);
2122
}
2223

2324
@Test
2425
public void isEqualToIntervalsWithEqualBeginAndEnd() {
25-
assertThat(interval).isEqualTo(new Interval(begin, end));
26-
assertThat(interval.hashCode()).isEqualTo(new Interval(begin, end).hashCode());
26+
assertThat(interval).isEqualTo(interval(begin, end));
27+
assertThat(interval.hashCode()).isEqualTo(interval(begin, end).hashCode());
2728
}
2829

2930
@Test
3031
public void isNotEqualToIntervalsWithDifferentBegin() {
31-
assertThat(interval).isNotEqualTo(new Interval(begin.plus(1), end));
32+
assertThat(interval).isNotEqualTo(interval(begin.plus(1), end));
3233
}
3334

3435
@Test
3536
public void isNotEqualToIntervalsWithDifferentEnd() {
36-
assertThat(interval).isNotEqualTo(new Interval(begin, end.plus(1)));
37+
assertThat(interval).isNotEqualTo(interval(begin, end.plus(1)));
3738
}
3839

3940
@Test
@@ -43,6 +44,6 @@ public void isNotEmpty() {
4344

4445
@Test
4546
public void isNotEqualToEmptyIntervals() {
46-
assertThat(interval).isNotEqualTo(new Interval(begin, begin));
47+
assertThat(interval).isNotEqualTo(interval(begin, begin));
4748
}
4849
}

src/test/java/net/itarray/automotion/tests/geometry/OverlappingIntervalsTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,26 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import org.junit.Test;
66

7+
import static net.itarray.automotion.internal.geometry.Interval.interval;
78
import static org.assertj.core.api.Assertions.assertThat;
89

910
public class OverlappingIntervalsTest extends TwoIntervalsTest{
1011

1112
public Interval left() {
12-
return new Interval(new Scalar(2), new Scalar(12));
13+
return interval(new Scalar(2), new Scalar(12));
1314
}
1415

1516
public Interval right() {
16-
return new Interval(new Scalar(10), new Scalar(17));
17+
return interval(new Scalar(10), new Scalar(17));
1718
}
1819

1920
@Test
2021
public void haveIntersectionBeginningAtLargerStartAndEndingAtSmallerEnd() {
21-
assertThat(right().intersect(left())).isEqualTo(new Interval(new Scalar(10), new Scalar(12)));
22+
assertThat(right().intersect(left())).isEqualTo(interval(new Scalar(10), new Scalar(12)));
2223
}
2324
@Test
2425
public void haveSpanFromSmallestBeginToLargestEnd() {
25-
Interval span = new Interval(new Scalar(2), new Scalar(17));
26+
Interval span = interval(new Scalar(2), new Scalar(17));
2627
assertThat(right().span(left())).isEqualTo(span);
2728
assertThat(left().span(right())).isEqualTo(span);
2829
}

src/test/java/net/itarray/automotion/tests/geometry/TouchingIntervalsTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44
import net.itarray.automotion.internal.geometry.Scalar;
55
import org.junit.Test;
66

7+
import static net.itarray.automotion.internal.geometry.Interval.interval;
78
import static org.assertj.core.api.Assertions.assertThat;
89

910
public class TouchingIntervalsTest extends TwoIntervalsTest{
1011

1112
public Interval left() {
12-
return new Interval(new Scalar(2), new Scalar(10));
13+
return interval(new Scalar(2), new Scalar(10));
1314
}
1415

1516
public Interval right() {
16-
return new Interval(new Scalar(10), new Scalar(17));
17+
return interval(new Scalar(10), new Scalar(17));
1718
}
1819

1920
@Test
@@ -23,7 +24,7 @@ public void haveEmptyIntersection() {
2324

2425
@Test
2526
public void haveSpanFromSmallestBeginToLargestEnd() {
26-
Interval span = new Interval(new Scalar(2), new Scalar(17));
27+
Interval span = interval(new Scalar(2), new Scalar(17));
2728
assertThat(right().span(left())).isEqualTo(span);
2829
assertThat(left().span(right())).isEqualTo(span);
2930
}

0 commit comments

Comments
 (0)