aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store/src
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store/src')
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java2
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java7
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java10
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java10
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java9
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java5
6 files changed, 43 insertions, 0 deletions
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java
index 704ca2fc..b20c685a 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java
@@ -18,6 +18,8 @@ public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval,
18 18
19 CardinalityInterval add(CardinalityInterval other); 19 CardinalityInterval add(CardinalityInterval other);
20 20
21 CardinalityInterval take(int count);
22
21 CardinalityInterval multiply(CardinalityInterval other); 23 CardinalityInterval multiply(CardinalityInterval other);
22 24
23 CardinalityInterval meet(CardinalityInterval other); 25 CardinalityInterval meet(CardinalityInterval other);
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java
index 49911c29..9e371e21 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java
@@ -5,6 +5,8 @@
5 */ 5 */
6package tools.refinery.store.representation.cardinality; 6package tools.refinery.store.representation.cardinality;
7 7
8// Singleton implementation, because there is only a single empty interval.
9@SuppressWarnings("squid:S6548")
8public final class EmptyCardinalityInterval implements CardinalityInterval { 10public final class EmptyCardinalityInterval implements CardinalityInterval {
9 static final EmptyCardinalityInterval INSTANCE = new EmptyCardinalityInterval(); 11 static final EmptyCardinalityInterval INSTANCE = new EmptyCardinalityInterval();
10 12
@@ -43,6 +45,11 @@ public final class EmptyCardinalityInterval implements CardinalityInterval {
43 } 45 }
44 46
45 @Override 47 @Override
48 public CardinalityInterval take(int count) {
49 return this;
50 }
51
52 @Override
46 public CardinalityInterval multiply(CardinalityInterval other) { 53 public CardinalityInterval multiply(CardinalityInterval other) {
47 return this; 54 return this;
48 } 55 }
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java
index 82afdbbc..acd82beb 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java
@@ -6,6 +6,7 @@
6package tools.refinery.store.representation.cardinality; 6package tools.refinery.store.representation.cardinality;
7 7
8import org.jetbrains.annotations.NotNull; 8import org.jetbrains.annotations.NotNull;
9import org.jetbrains.annotations.Nullable;
9 10
10import java.util.function.IntBinaryOperator; 11import java.util.function.IntBinaryOperator;
11 12
@@ -22,6 +23,15 @@ public record FiniteUpperCardinality(int finiteUpperBound) implements UpperCardi
22 } 23 }
23 24
24 @Override 25 @Override
26 @Nullable
27 public UpperCardinality take(int count) {
28 if (finiteUpperBound < count) {
29 return null;
30 }
31 return new FiniteUpperCardinality(finiteUpperBound - count);
32 }
33
34 @Override
25 public UpperCardinality multiply(UpperCardinality other) { 35 public UpperCardinality multiply(UpperCardinality other) {
26 return lift(other, (a, b) -> a * b); 36 return lift(other, (a, b) -> a * b);
27 } 37 }
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
index 38bd53bf..2e7780da 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java
@@ -53,6 +53,16 @@ public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upper
53 return lift(other, Math::min, UpperCardinality::max, this); 53 return lift(other, Math::min, UpperCardinality::max, this);
54 } 54 }
55 55
56 @Override
57 public CardinalityInterval take(int count) {
58 int newLowerBound = Math.max(lowerBound - count, 0);
59 var newUpperBound = upperBound.take(count);
60 if (newUpperBound == null) {
61 return CardinalityIntervals.ERROR;
62 }
63 return CardinalityIntervals.between(newLowerBound, newUpperBound);
64 }
65
56 private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator, 66 private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator,
57 BinaryOperator<UpperCardinality> upperOperator, 67 BinaryOperator<UpperCardinality> upperOperator,
58 CardinalityInterval whenEmpty) { 68 CardinalityInterval whenEmpty) {
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java
index a5634020..e3a334cd 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java
@@ -7,6 +7,8 @@ package tools.refinery.store.representation.cardinality;
7 7
8import org.jetbrains.annotations.NotNull; 8import org.jetbrains.annotations.NotNull;
9 9
10// Singleton implementation, because there is only a single countable infinity.
11@SuppressWarnings("squid:S6548")
10public final class UnboundedUpperCardinality implements UpperCardinality { 12public final class UnboundedUpperCardinality implements UpperCardinality {
11 static final UnboundedUpperCardinality INSTANCE = new UnboundedUpperCardinality(); 13 static final UnboundedUpperCardinality INSTANCE = new UnboundedUpperCardinality();
12 14
@@ -20,10 +22,17 @@ public final class UnboundedUpperCardinality implements UpperCardinality {
20 } 22 }
21 23
22 @Override 24 @Override
25 public UpperCardinality take(int count) {
26 return this;
27 }
28
29 @Override
23 public UpperCardinality multiply(UpperCardinality other) { 30 public UpperCardinality multiply(UpperCardinality other) {
24 return this; 31 return this;
25 } 32 }
26 33
34 // This should always be greater than any finite cardinality.
35 @SuppressWarnings("ComparatorMethodParameterNotUsed")
27 @Override 36 @Override
28 public int compareTo(@NotNull UpperCardinality upperCardinality) { 37 public int compareTo(@NotNull UpperCardinality upperCardinality) {
29 if (upperCardinality instanceof FiniteUpperCardinality) { 38 if (upperCardinality instanceof FiniteUpperCardinality) {
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java
index 5dbaa922..5600ab4c 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java
@@ -5,6 +5,8 @@
5 */ 5 */
6package tools.refinery.store.representation.cardinality; 6package tools.refinery.store.representation.cardinality;
7 7
8import org.jetbrains.annotations.Nullable;
9
8public sealed interface UpperCardinality extends Comparable<UpperCardinality> permits FiniteUpperCardinality, 10public sealed interface UpperCardinality extends Comparable<UpperCardinality> permits FiniteUpperCardinality,
9 UnboundedUpperCardinality { 11 UnboundedUpperCardinality {
10 default UpperCardinality min(UpperCardinality other) { 12 default UpperCardinality min(UpperCardinality other) {
@@ -17,6 +19,9 @@ public sealed interface UpperCardinality extends Comparable<UpperCardinality> pe
17 19
18 UpperCardinality add(UpperCardinality other); 20 UpperCardinality add(UpperCardinality other);
19 21
22 @Nullable
23 UpperCardinality take(int count);
24
20 UpperCardinality multiply(UpperCardinality other); 25 UpperCardinality multiply(UpperCardinality other);
21 26
22 int compareToInt(int value); 27 int compareToInt(int value);