aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java')
-rw-r--r--subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java84
1 files changed, 84 insertions, 0 deletions
diff --git a/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java b/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java
new file mode 100644
index 00000000..7c45e6ef
--- /dev/null
+++ b/subprojects/logic/src/main/java/tools/refinery/logic/term/uppercardinality/UpperCardinalitySumAggregator.java
@@ -0,0 +1,84 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.logic.term.uppercardinality;
7
8import tools.refinery.logic.term.StatefulAggregate;
9import tools.refinery.logic.term.StatefulAggregator;
10
11// Singleton implementation, since there is only one way to aggregate upper cardinalities.
12@SuppressWarnings("squid:S6548")
13public class UpperCardinalitySumAggregator implements StatefulAggregator<UpperCardinality, UpperCardinality> {
14 public static final UpperCardinalitySumAggregator INSTANCE = new UpperCardinalitySumAggregator();
15
16 private UpperCardinalitySumAggregator() {
17 }
18
19 @Override
20 public Class<UpperCardinality> getResultType() {
21 return UpperCardinality.class;
22 }
23
24 @Override
25 public Class<UpperCardinality> getInputType() {
26 return UpperCardinality.class;
27 }
28
29 @Override
30 public StatefulAggregate<UpperCardinality, UpperCardinality> createEmptyAggregate() {
31 return new Aggregate();
32 }
33
34 private static class Aggregate implements StatefulAggregate<UpperCardinality, UpperCardinality> {
35 private int sumFiniteUpperBounds;
36 private int countUnbounded;
37
38 public Aggregate() {
39 this(0, 0);
40 }
41
42 private Aggregate(int sumFiniteUpperBounds, int countUnbounded) {
43 this.sumFiniteUpperBounds = sumFiniteUpperBounds;
44 this.countUnbounded = countUnbounded;
45 }
46
47 @Override
48 public void add(UpperCardinality value) {
49 if (value instanceof FiniteUpperCardinality finiteUpperCardinality) {
50 sumFiniteUpperBounds += finiteUpperCardinality.finiteUpperBound();
51 } else if (value instanceof UnboundedUpperCardinality) {
52 countUnbounded += 1;
53 } else {
54 throw new IllegalArgumentException("Unknown UpperCardinality: " + value);
55 }
56 }
57
58 @Override
59 public void remove(UpperCardinality value) {
60 if (value instanceof FiniteUpperCardinality finiteUpperCardinality) {
61 sumFiniteUpperBounds -= finiteUpperCardinality.finiteUpperBound();
62 } else if (value instanceof UnboundedUpperCardinality) {
63 countUnbounded -= 1;
64 } else {
65 throw new IllegalArgumentException("Unknown UpperCardinality: " + value);
66 }
67 }
68
69 @Override
70 public UpperCardinality getResult() {
71 return countUnbounded > 0 ? UpperCardinalities.UNBOUNDED : UpperCardinalities.atMost(sumFiniteUpperBounds);
72 }
73
74 @Override
75 public boolean isEmpty() {
76 return sumFiniteUpperBounds == 0 && countUnbounded == 0;
77 }
78
79 @Override
80 public StatefulAggregate<UpperCardinality, UpperCardinality> deepCopy() {
81 return new Aggregate(sumFiniteUpperBounds, countUnbounded);
82 }
83 }
84}