From 16a9b534adec2c53b50f92a43c1623918b1c59c0 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 7 Mar 2024 22:10:42 +0100 Subject: refactor: move terms and DNF into logic subproject --- .../store/representation/AbstractDomain.java | 37 ------- .../store/representation/AnyAbstractDomain.java | 12 --- .../refinery/store/representation/TruthValue.java | 76 --------------- .../store/representation/TruthValueDomain.java | 66 ------------- .../cardinality/CardinalityDomain.java | 68 ------------- .../cardinality/CardinalityInterval.java | 28 ------ .../cardinality/CardinalityIntervals.java | 51 ---------- .../cardinality/EmptyCardinalityInterval.java | 71 -------------- .../cardinality/FiniteUpperCardinality.java | 83 ---------------- .../cardinality/NonEmptyCardinalityInterval.java | 106 --------------------- .../cardinality/UnboundedUpperCardinality.java | 66 ------------- .../cardinality/UpperCardinalities.java | 38 -------- .../cardinality/UpperCardinality.java | 32 ------- .../refinery/store/util/CycleDetectingMapper.java | 61 ------------ 14 files changed, 795 deletions(-) delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/AbstractDomain.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/AnyAbstractDomain.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/TruthValue.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/TruthValueDomain.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityDomain.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityIntervals.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinalities.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/util/CycleDetectingMapper.java (limited to 'subprojects/store/src/main/java/tools') diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/AbstractDomain.java b/subprojects/store/src/main/java/tools/refinery/store/representation/AbstractDomain.java deleted file mode 100644 index dfdb43bd..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/AbstractDomain.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation; - -import java.util.Objects; -import java.util.Optional; - -public non-sealed interface AbstractDomain extends AnyAbstractDomain { - @Override - Class abstractType(); - - @Override - Class concreteType(); - - A toAbstract(C concreteValue); - - Optional toConcrete(A abstractValue); - - default boolean isConcrete(A abstractValue) { - return toConcrete(abstractValue).isPresent(); - } - - default boolean isRefinement(A originalValue, A refinedValue) { - return Objects.equals(commonRefinement(originalValue, refinedValue), refinedValue); - } - - A commonRefinement(A leftValue, A rightValue); - - A commonAncestor(A leftValue, A rightValue); - - A unknown(); - - boolean isError(A abstractValue); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/AnyAbstractDomain.java b/subprojects/store/src/main/java/tools/refinery/store/representation/AnyAbstractDomain.java deleted file mode 100644 index c354fab7..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/AnyAbstractDomain.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation; - -public sealed interface AnyAbstractDomain permits AbstractDomain { - Class abstractType(); - - Class concreteType(); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValue.java b/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValue.java deleted file mode 100644 index f81ee9a4..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValue.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation; - -public enum TruthValue { - TRUE("true"), - - FALSE("false"), - - UNKNOWN("unknown"), - - ERROR("error"); - - private final String name; - - TruthValue(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public static TruthValue toTruthValue(boolean value) { - return value ? TRUE : FALSE; - } - - public boolean isConsistent() { - return this != ERROR; - } - - public boolean isComplete() { - return this != UNKNOWN; - } - - public boolean isConcrete() { - return this == TRUE || this == FALSE; - } - - public boolean must() { - return this == TRUE || this == ERROR; - } - - public boolean may() { - return this == TRUE || this == UNKNOWN; - } - - public TruthValue not() { - return switch (this) { - case TRUE -> FALSE; - case FALSE -> TRUE; - default -> this; - }; - } - - public TruthValue merge(TruthValue other) { - return switch (this) { - case TRUE -> other == UNKNOWN || other == TRUE ? TRUE : ERROR; - case FALSE -> other == UNKNOWN || other == FALSE ? FALSE : ERROR; - case UNKNOWN -> other; - case ERROR -> ERROR; - }; - } - - public TruthValue join(TruthValue other) { - return switch (this) { - case TRUE -> other == ERROR || other == TRUE ? TRUE : UNKNOWN; - case FALSE -> other == ERROR || other == FALSE ? FALSE : UNKNOWN; - case UNKNOWN -> UNKNOWN; - case ERROR -> other; - }; - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValueDomain.java b/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValueDomain.java deleted file mode 100644 index 61696dca..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/TruthValueDomain.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation; - -import java.util.Optional; - -// Singleton pattern, because there is only one domain for truth values. -@SuppressWarnings("squid:S6548") -public final class TruthValueDomain implements AbstractDomain { - public static final TruthValueDomain INSTANCE = new TruthValueDomain(); - - private TruthValueDomain() { - } - - @Override - public Class abstractType() { - return TruthValue.class; - } - - @Override - public Class concreteType() { - return Boolean.class; - } - - @Override - public TruthValue toAbstract(Boolean concreteValue) { - return TruthValue.toTruthValue(concreteValue); - } - - @Override - public Optional toConcrete(TruthValue abstractValue) { - return switch (abstractValue) { - case TRUE -> Optional.of(true); - case FALSE -> Optional.of(false); - default -> Optional.empty(); - }; - } - - @Override - public boolean isConcrete(TruthValue abstractValue) { - return abstractValue.isConcrete(); - } - - @Override - public TruthValue commonRefinement(TruthValue leftValue, TruthValue rightValue) { - return leftValue.merge(rightValue); - } - - @Override - public TruthValue commonAncestor(TruthValue leftValue, TruthValue rightValue) { - return leftValue.join(rightValue); - } - - @Override - public TruthValue unknown() { - return TruthValue.UNKNOWN; - } - - @Override - public boolean isError(TruthValue abstractValue) { - return !abstractValue.isConsistent(); - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityDomain.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityDomain.java deleted file mode 100644 index 7ae2d935..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityDomain.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -import tools.refinery.store.representation.AbstractDomain; - -import java.util.Optional; - -// Singleton pattern, because there is only one domain for truth values. -@SuppressWarnings("squid:S6548") -public class CardinalityDomain implements AbstractDomain { - public static final CardinalityDomain INSTANCE = new CardinalityDomain(); - - private CardinalityDomain() { - } - - @Override - public Class abstractType() { - return CardinalityInterval.class; - } - - @Override - public Class concreteType() { - return Integer.class; - } - - @Override - public CardinalityInterval toAbstract(Integer concreteValue) { - return CardinalityIntervals.exactly(concreteValue); - } - - @Override - public Optional toConcrete(CardinalityInterval abstractValue) { - return isConcrete(abstractValue) ? Optional.of(abstractValue.lowerBound()) : Optional.empty(); - } - - @Override - public boolean isConcrete(CardinalityInterval abstractValue) { - if (!(abstractValue instanceof NonEmptyCardinalityInterval nonEmptyValue) || - !((nonEmptyValue.upperBound()) instanceof FiniteUpperCardinality finiteUpperCardinality)) { - return false; - } - return nonEmptyValue.lowerBound() == finiteUpperCardinality.finiteUpperBound(); - } - - @Override - public CardinalityInterval commonRefinement(CardinalityInterval leftValue, CardinalityInterval rightValue) { - return leftValue.meet(rightValue); - } - - @Override - public CardinalityInterval commonAncestor(CardinalityInterval leftValue, CardinalityInterval rightValue) { - return leftValue.join(rightValue); - } - - @Override - public CardinalityInterval unknown() { - return CardinalityIntervals.SET; - } - - @Override - public boolean isError(CardinalityInterval abstractValue) { - return abstractValue.isEmpty(); - } -} 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 deleted file mode 100644 index b20c685a..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityInterval.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -public sealed interface CardinalityInterval permits NonEmptyCardinalityInterval, EmptyCardinalityInterval { - int lowerBound(); - - UpperCardinality upperBound(); - - boolean isEmpty(); - - CardinalityInterval min(CardinalityInterval other); - - CardinalityInterval max(CardinalityInterval other); - - CardinalityInterval add(CardinalityInterval other); - - CardinalityInterval take(int count); - - CardinalityInterval multiply(CardinalityInterval other); - - CardinalityInterval meet(CardinalityInterval other); - - CardinalityInterval join(CardinalityInterval other); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityIntervals.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityIntervals.java deleted file mode 100644 index 855fd248..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/CardinalityIntervals.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -public final class CardinalityIntervals { - public static final CardinalityInterval NONE = exactly(0); - - public static final CardinalityInterval ONE = exactly(1); - - public static final CardinalityInterval LONE = atMost(1); - - public static final CardinalityInterval SET = atLeast(0); - - public static final CardinalityInterval SOME = atLeast(1); - - public static final CardinalityInterval ERROR = EmptyCardinalityInterval.INSTANCE; - - private CardinalityIntervals() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static CardinalityInterval between(int lowerBound, UpperCardinality upperBound) { - if (upperBound.compareToInt(lowerBound) < 0) { - return ERROR; - } - return new NonEmptyCardinalityInterval(lowerBound, upperBound); - } - - public static CardinalityInterval between(int lowerBound, int upperBound) { - return between(lowerBound, UpperCardinalities.atMost(upperBound)); - } - - public static CardinalityInterval atMost(UpperCardinality upperBound) { - return new NonEmptyCardinalityInterval(0, upperBound); - } - - public static CardinalityInterval atMost(int upperBound) { - return atMost(UpperCardinalities.atMost(upperBound)); - } - - public static CardinalityInterval atLeast(int lowerBound) { - return new NonEmptyCardinalityInterval(lowerBound, UpperCardinalities.UNBOUNDED); - } - - public static CardinalityInterval exactly(int lowerBound) { - return new NonEmptyCardinalityInterval(lowerBound, UpperCardinalities.atMost(lowerBound)); - } -} 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 deleted file mode 100644 index 9e371e21..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/EmptyCardinalityInterval.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -// Singleton implementation, because there is only a single empty interval. -@SuppressWarnings("squid:S6548") -public final class EmptyCardinalityInterval implements CardinalityInterval { - static final EmptyCardinalityInterval INSTANCE = new EmptyCardinalityInterval(); - - private EmptyCardinalityInterval() { - // Singleton constructor. - } - - @Override - public int lowerBound() { - return 1; - } - - @Override - public boolean isEmpty() { - return true; - } - - @Override - public UpperCardinality upperBound() { - return UpperCardinalities.ZERO; - } - - @Override - public CardinalityInterval min(CardinalityInterval other) { - return this; - } - - @Override - public CardinalityInterval max(CardinalityInterval other) { - return this; - } - - @Override - public CardinalityInterval add(CardinalityInterval other) { - return this; - } - - @Override - public CardinalityInterval take(int count) { - return this; - } - - @Override - public CardinalityInterval multiply(CardinalityInterval other) { - return this; - } - - @Override - public CardinalityInterval meet(CardinalityInterval other) { - return this; - } - - @Override - public CardinalityInterval join(CardinalityInterval other) { - return other; - } - - @Override - public String toString() { - return "error"; - } -} 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 deleted file mode 100644 index b63a8637..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/FiniteUpperCardinality.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.function.IntBinaryOperator; - -public record FiniteUpperCardinality(int finiteUpperBound) implements UpperCardinality { - public FiniteUpperCardinality { - if (finiteUpperBound < 0) { - throw new IllegalArgumentException("finiteUpperBound must not be negative"); - } - } - - @Override - public UpperCardinality add(UpperCardinality other) { - return lift(other, Integer::sum); - } - - @Override - @Nullable - public UpperCardinality take(int count) { - if (finiteUpperBound < count) { - return null; - } - return new FiniteUpperCardinality(finiteUpperBound - count); - } - - @Override - public UpperCardinality multiply(UpperCardinality other) { - return lift(other, (a, b) -> a * b); - } - - @Override - public int compareTo(@NotNull UpperCardinality upperCardinality) { - if (upperCardinality instanceof FiniteUpperCardinality finiteUpperCardinality) { - return compareToInt(finiteUpperCardinality.finiteUpperBound); - } - if (upperCardinality instanceof UnboundedUpperCardinality) { - return -1; - } - throw new IllegalArgumentException("Unknown UpperCardinality: " + upperCardinality); - } - - @Override - public int compareToInt(int value) { - return Integer.compare(finiteUpperBound, value); - } - - @Override - public String toString() { - return Integer.toString(finiteUpperBound); - } - - private UpperCardinality lift(@NotNull UpperCardinality other, IntBinaryOperator operator) { - if (other instanceof FiniteUpperCardinality finiteUpperCardinality) { - return UpperCardinalities.atMost(operator.applyAsInt(finiteUpperBound, - finiteUpperCardinality.finiteUpperBound)); - } - if (other instanceof UnboundedUpperCardinality) { - return UpperCardinalities.UNBOUNDED; - } - throw new IllegalArgumentException("Unknown UpperCardinality: " + other); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FiniteUpperCardinality that = (FiniteUpperCardinality) o; - return finiteUpperBound == that.finiteUpperBound; - } - - @Override - public int hashCode() { - return finiteUpperBound; - } -} 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 deleted file mode 100644 index 6bd66df7..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/NonEmptyCardinalityInterval.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -import java.util.Objects; -import java.util.function.BinaryOperator; -import java.util.function.IntBinaryOperator; - -public record NonEmptyCardinalityInterval(int lowerBound, UpperCardinality upperBound) implements CardinalityInterval { - public NonEmptyCardinalityInterval { - if (lowerBound < 0) { - throw new IllegalArgumentException("lowerBound must not be negative"); - } - if (upperBound.compareToInt(lowerBound) < 0) { - throw new IllegalArgumentException("lowerBound must not be larger than upperBound"); - } - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public CardinalityInterval min(CardinalityInterval other) { - return lift(other, Math::min, UpperCardinality::min); - } - - @Override - public CardinalityInterval max(CardinalityInterval other) { - return lift(other, Math::max, UpperCardinality::max); - } - - @Override - public CardinalityInterval add(CardinalityInterval other) { - return lift(other, Integer::sum, UpperCardinality::add); - } - - @Override - public CardinalityInterval multiply(CardinalityInterval other) { - return lift(other, (a, b) -> a * b, UpperCardinality::multiply); - } - - @Override - public CardinalityInterval meet(CardinalityInterval other) { - return lift(other, Math::max, UpperCardinality::min); - } - - @Override - public CardinalityInterval join(CardinalityInterval other) { - return lift(other, Math::min, UpperCardinality::max, this); - } - - @Override - public CardinalityInterval take(int count) { - int newLowerBound = Math.max(lowerBound - count, 0); - var newUpperBound = upperBound.take(count); - if (newUpperBound == null) { - return CardinalityIntervals.ERROR; - } - return CardinalityIntervals.between(newLowerBound, newUpperBound); - } - - private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator, - BinaryOperator upperOperator, - CardinalityInterval whenEmpty) { - if (other instanceof NonEmptyCardinalityInterval nonEmptyOther) { - return CardinalityIntervals.between(lowerOperator.applyAsInt(lowerBound, nonEmptyOther.lowerBound), - upperOperator.apply(upperBound, nonEmptyOther.upperBound)); - } - if (other instanceof EmptyCardinalityInterval) { - return whenEmpty; - } - throw new IllegalArgumentException("Unknown CardinalityInterval: " + other); - } - - private CardinalityInterval lift(CardinalityInterval other, IntBinaryOperator lowerOperator, - BinaryOperator upperOperator) { - return lift(other, lowerOperator, upperOperator, CardinalityIntervals.ERROR); - } - - @Override - public String toString() { - if (upperBound instanceof FiniteUpperCardinality finiteUpperCardinality && - finiteUpperCardinality.finiteUpperBound() == lowerBound) { - return "[%d]".formatted(lowerBound); - } - return "[%d..%s]".formatted(lowerBound, upperBound); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - NonEmptyCardinalityInterval that = (NonEmptyCardinalityInterval) o; - return lowerBound == that.lowerBound && Objects.equals(upperBound, that.upperBound); - } - - @Override - public int hashCode() { - return lowerBound * 31 + upperBound.hashCode(); - } -} 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 deleted file mode 100644 index 03c701ae..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UnboundedUpperCardinality.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -import org.jetbrains.annotations.NotNull; - -// Singleton implementation, because there is only a single countable infinity. -@SuppressWarnings("squid:S6548") -public final class UnboundedUpperCardinality implements UpperCardinality { - static final UnboundedUpperCardinality INSTANCE = new UnboundedUpperCardinality(); - - private UnboundedUpperCardinality() { - // Singleton constructor. - } - - @Override - public UpperCardinality add(UpperCardinality other) { - return this; - } - - @Override - public UpperCardinality take(int count) { - return this; - } - - @Override - public UpperCardinality multiply(UpperCardinality other) { - return this; - } - - // This should always be greater than any finite cardinality. - @SuppressWarnings("ComparatorMethodParameterNotUsed") - @Override - public int compareTo(@NotNull UpperCardinality upperCardinality) { - if (upperCardinality instanceof FiniteUpperCardinality) { - return 1; - } - if (upperCardinality instanceof UnboundedUpperCardinality) { - return 0; - } - throw new IllegalArgumentException("Unknown UpperCardinality: " + upperCardinality); - } - - @Override - public int compareToInt(int value) { - return 1; - } - - @Override - public String toString() { - return "*"; - } - - @Override - public boolean equals(Object obj) { - return this == obj || (obj != null && getClass() == obj.getClass()); - } - - @Override - public int hashCode() { - return -1; - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinalities.java b/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinalities.java deleted file mode 100644 index 17d1b292..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinalities.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -public final class UpperCardinalities { - public static final UpperCardinality UNBOUNDED = UnboundedUpperCardinality.INSTANCE; - - public static final UpperCardinality ZERO; - - public static final UpperCardinality ONE; - - private static final FiniteUpperCardinality[] cache = new FiniteUpperCardinality[256]; - - static { - for (int i = 0; i < cache.length; i++) { - cache[i] = new FiniteUpperCardinality(i); - } - ZERO = cache[0]; - ONE = cache[1]; - } - - private UpperCardinalities() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static UpperCardinality atMost(int upperBound) { - if (upperBound < 0) { - return UNBOUNDED; - } - if (upperBound < cache.length) { - return cache[upperBound]; - } - return new FiniteUpperCardinality(upperBound); - } -} 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 deleted file mode 100644 index 3f0db028..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/representation/cardinality/UpperCardinality.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.representation.cardinality; - -import org.jetbrains.annotations.Nullable; - -public sealed interface UpperCardinality extends Comparable permits FiniteUpperCardinality, - UnboundedUpperCardinality { - default UpperCardinality min(UpperCardinality other) { - return this.compareTo(other) <= 0 ? this : other; - } - - default UpperCardinality max(UpperCardinality other) { - return this.compareTo(other) >= 0 ? this : other; - } - - UpperCardinality add(UpperCardinality other); - - @Nullable - UpperCardinality take(int count); - - UpperCardinality multiply(UpperCardinality other); - - int compareToInt(int value); - - static UpperCardinality of(int upperBound) { - return UpperCardinalities.atMost(upperBound); - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/util/CycleDetectingMapper.java b/subprojects/store/src/main/java/tools/refinery/store/util/CycleDetectingMapper.java deleted file mode 100644 index 2e302663..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/util/CycleDetectingMapper.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.util; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class CycleDetectingMapper { - private static final String SEPARATOR = " -> "; - - private final Function getName; - - private final Function doMap; - - private final Set inProgress = new LinkedHashSet<>(); - - private final Map results = new HashMap<>(); - - public CycleDetectingMapper(Function doMap) { - this(Objects::toString, doMap); - } - - public CycleDetectingMapper(Function getName, Function doMap) { - this.getName = getName; - this.doMap = doMap; - } - - public R map(T input) { - if (inProgress.contains(input)) { - var path = inProgress.stream().map(getName).collect(Collectors.joining(SEPARATOR)); - throw new IllegalArgumentException("Circular reference %s%s%s detected".formatted(path, SEPARATOR, - getName.apply(input))); - } - // We can't use computeIfAbsent here, because translating referenced queries calls this method in a reentrant - // way, which would cause a ConcurrentModificationException with computeIfAbsent. - @SuppressWarnings("squid:S3824") - var result = results.get(input); - if (result == null) { - inProgress.add(input); - try { - result = doMap.apply(input); - results.put(input, result); - } finally { - inProgress.remove(input); - } - } - return result; - } - - public List getInProgress() { - return List.copyOf(inProgress); - } - - public R getAlreadyMapped(T input) { - return results.get(input); - } -} -- cgit v1.2.3-70-g09d2