diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/util/EclipseCollectionsLongMultiset.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/util/EclipseCollectionsLongMultiset.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/util/EclipseCollectionsLongMultiset.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/util/EclipseCollectionsLongMultiset.java new file mode 100644 index 00000000..88773c5d --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/util/EclipseCollectionsLongMultiset.java | |||
@@ -0,0 +1,150 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2010-2018, Gabor Bergmann, IncQueryLabs Ltd. | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | package tools.refinery.viatra.runtime.matchers.util; | ||
10 | |||
11 | import java.util.Iterator; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.BiConsumer; | ||
14 | |||
15 | import org.eclipse.collections.impl.map.mutable.primitive.LongIntHashMap; | ||
16 | |||
17 | /** | ||
18 | * @author Gabor Bergmann | ||
19 | * @since 2.0 | ||
20 | * <p> TODO refactor common methods with {@link EclipseCollectionsMultiset} | ||
21 | * <p> TODO refactor into LongBagMemory etc. | ||
22 | */ | ||
23 | public class EclipseCollectionsLongMultiset extends LongIntHashMap implements IMultiset<Long> { | ||
24 | |||
25 | @Override | ||
26 | public boolean addOne(Long value) { | ||
27 | int oldCount = super.getIfAbsent(value, 0); | ||
28 | |||
29 | super.put(value, oldCount + 1); | ||
30 | |||
31 | return oldCount == 0; | ||
32 | } | ||
33 | |||
34 | @Override | ||
35 | public boolean addSigned(Long value, int count) { | ||
36 | int oldCount = super.getIfAbsent(value, 0); | ||
37 | int newCount = oldCount + count; | ||
38 | |||
39 | boolean becomesZero = newCount == 0; | ||
40 | if (newCount < 0) | ||
41 | throw new IllegalStateException(String.format( | ||
42 | "Cannot remove %d occurrences of value '%s' as only %d would remain in %s", | ||
43 | count, value, newCount, this)); | ||
44 | else if (becomesZero) | ||
45 | super.removeKey(value); | ||
46 | else // (newCount > 0) | ||
47 | super.put(value, newCount); | ||
48 | |||
49 | return becomesZero || oldCount == 0; | ||
50 | } | ||
51 | |||
52 | @Override | ||
53 | public boolean removeOne(Long value) { | ||
54 | return removeOneInternal(value, true); | ||
55 | } | ||
56 | /** | ||
57 | * @since 2.3 | ||
58 | */ | ||
59 | @Override | ||
60 | public boolean removeOneOrNop(Long value) { | ||
61 | return removeOneInternal(value, false); | ||
62 | } | ||
63 | |||
64 | |||
65 | /** | ||
66 | * @since 2.3 | ||
67 | */ | ||
68 | protected boolean removeOneInternal(Long value, boolean throwIfImpossible) { | ||
69 | int oldCount = super.getIfAbsent(value, 0); | ||
70 | if (oldCount == 0) { | ||
71 | if (throwIfImpossible) throw new IllegalStateException(String.format( | ||
72 | "Cannot remove value '%s' that is not contained in %s", | ||
73 | value, this)); | ||
74 | else return false; | ||
75 | } | ||
76 | |||
77 | int rest = oldCount - 1; | ||
78 | boolean empty = rest == 0; | ||
79 | |||
80 | if (!empty) { | ||
81 | super.put(value, rest); | ||
82 | } else { | ||
83 | super.remove(value); | ||
84 | } | ||
85 | |||
86 | return empty; | ||
87 | } | ||
88 | |||
89 | @Override | ||
90 | public void clearAllOf(Long value) { | ||
91 | super.remove(value); | ||
92 | } | ||
93 | |||
94 | @Override | ||
95 | public int getCount(Long value) { | ||
96 | return super.getIfAbsent(value, 0); | ||
97 | } | ||
98 | @Override | ||
99 | public int getCountUnsafe(Object value) { | ||
100 | return value instanceof Long ? getCount((Long) value) : 0; | ||
101 | } | ||
102 | |||
103 | @Override | ||
104 | public boolean containsNonZero(Long value) { | ||
105 | return super.containsKey(value); | ||
106 | } | ||
107 | |||
108 | @Override | ||
109 | public boolean containsNonZeroUnsafe(Object value) { | ||
110 | return value instanceof Long && containsNonZero((Long) value); | ||
111 | } | ||
112 | |||
113 | @Override | ||
114 | public Iterator<Long> iterator() { | ||
115 | return EclipseCollectionsLongSetMemory.iteratorOf(super.keySet()); | ||
116 | } | ||
117 | |||
118 | @Override | ||
119 | public boolean addPositive(Long value, int count) { | ||
120 | if (count < 0) { | ||
121 | throw new IllegalArgumentException("The count value must be positive!"); | ||
122 | } | ||
123 | |||
124 | int oldCount = super.getIfAbsent(value, 0); | ||
125 | |||
126 | super.put(value, oldCount + count); | ||
127 | |||
128 | return oldCount == 0; | ||
129 | } | ||
130 | |||
131 | @Override | ||
132 | public Set<Long> distinctValues() { | ||
133 | return new EclipseCollectionsLongSetMemory.SetWrapper(super.keySet()); | ||
134 | } | ||
135 | |||
136 | @Override | ||
137 | public void forEachEntryWithMultiplicities(BiConsumer<Long, Integer> entryConsumer) { | ||
138 | super.forEachKeyValue(entryConsumer::accept); | ||
139 | } | ||
140 | |||
141 | @Override | ||
142 | public int hashCode() { | ||
143 | return IMemoryView.hashCode(this); | ||
144 | } | ||
145 | @Override | ||
146 | public boolean equals(Object obj) { | ||
147 | return IMemoryView.equals(this, obj); | ||
148 | } | ||
149 | |||
150 | } | ||