Skip to content

Commit 1f25f68

Browse files
simplify StringMultiTrie generics
fix StringMultiTrie::put
1 parent 7196fe1 commit 1f25f68

File tree

2 files changed

+21
-28
lines changed

2 files changed

+21
-28
lines changed

enigma/src/main/java/org/quiltmc/enigma/util/multi_trie/CompositeStringMultiTrie.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,7 @@ public StringMultiTrie.View<V, Branch<V>, Root<V>> getView() {
7272
return this.view;
7373
}
7474

75-
public static final class Root<V>
76-
extends MutableMapNode<Character, V, Branch<V>>
77-
implements MutableCharacterNode<V, Branch<V>> {
75+
public static final class Root<V> extends StringMultiTrie.Root<V, Branch<V>> {
7876
private final Collection<V> leaves;
7977
private final Map<Character, CompositeStringMultiTrie.Branch<V>> branches;
8078

@@ -112,7 +110,7 @@ public CharacterNode<V> getView() {
112110
}
113111
}
114112

115-
public static final class Branch<V> extends StringMultiTrie.BranchNode<V, Branch<V>> {
113+
public static final class Branch<V> extends StringMultiTrie.Branch<V, Branch<V>> {
116114
private final MutableMapNode<Character, V, CompositeStringMultiTrie.Branch<V>> parent;
117115
private final Character key;
118116

enigma/src/main/java/org/quiltmc/enigma/util/multi_trie/StringMultiTrie.java

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.quiltmc.enigma.util.multi_trie;
22

33
import org.quiltmc.enigma.util.Utils;
4-
import org.quiltmc.enigma.util.multi_trie.StringMultiTrie.BranchNode;
5-
import org.quiltmc.enigma.util.multi_trie.StringMultiTrie.MutableCharacterNode;
4+
import org.quiltmc.enigma.util.multi_trie.StringMultiTrie.Branch;
5+
import org.quiltmc.enigma.util.multi_trie.StringMultiTrie.Root;
66

77
import java.util.Optional;
88
import java.util.function.BiFunction;
@@ -26,13 +26,9 @@
2626
* @param <V> the type of values
2727
* @param <B> the type of branch nodes
2828
*/
29-
public abstract class StringMultiTrie
30-
<
31-
V, B extends BranchNode<V, B> & MutableCharacterNode<V, B>,
32-
R extends MutableMapNode<Character, V, B> & MutableCharacterNode<V, B>
33-
>
29+
public abstract class StringMultiTrie<V, B extends Branch<V, B>, R extends Root<V, B>>
3430
implements MutableMultiTrie<Character, V> {
35-
private static Optional<Character> tryToggleCase(char c) {
31+
protected static Optional<Character> tryToggleCase(char c) {
3632
if (Character.isUpperCase(c)) {
3733
return Optional.of(Character.toLowerCase(c));
3834
} else if (Character.isLowerCase(c)) {
@@ -66,10 +62,6 @@ private MutableCharacterNode<V, B> getImpl(
6662
Utils.requireNonNull(prefix, PREFIX);
6763

6864
MutableCharacterNode<V, B> node = this.getRoot();
69-
if (prefix.isEmpty()) {
70-
return node;
71-
}
72-
7365
for (int i = 0; i < prefix.length(); i++) {
7466
node = next.apply(node, prefix.charAt(i));
7567
}
@@ -83,19 +75,22 @@ public MutableCharacterNode<V, B> put(String string, V value) {
8375

8476
final R root = this.getRoot();
8577
if (string.isEmpty()) {
78+
root.put(value);
79+
8680
return root;
8781
}
8882

89-
B node = root.next(string.charAt(0));
83+
// Don't use next, initially creating orphans, because we always put a value,
84+
// so all orphans would be adopted anyway.
85+
B branch = root.getBranches().computeIfAbsent(string.charAt(0), root::createBranch);
9086
for (int i = 1; i < string.length(); i++) {
91-
final B parent = node;
92-
final char key = string.charAt(i);
93-
node = node.getBranches().computeIfAbsent(key, ignored -> parent.createBranch(key));
87+
final B parent = branch;
88+
branch = branch.getBranches().computeIfAbsent(string.charAt(i), parent::createBranch);
9489
}
9590

96-
node.put(value);
91+
branch.put(value);
9792

98-
return node;
93+
return branch;
9994
}
10095

10196
public boolean remove(String string, V value) {
@@ -159,15 +154,15 @@ default MutableCharacterNode<V, B> nextIgnoreCase(Character key) {
159154
}
160155
}
161156

162-
public abstract static class BranchNode<V, B extends BranchNode<V, B>>
157+
public abstract static class Root<V, B extends Branch<V, B>>
158+
extends MutableMapNode<Character, V, B>
159+
implements MutableCharacterNode<V, B> { }
160+
161+
public abstract static class Branch<V, B extends Branch<V, B>>
163162
extends MutableMapNode.Branch<Character, V, B>
164163
implements MutableCharacterNode<V, B> { }
165164

166-
public abstract static class View
167-
<
168-
V, B extends BranchNode<V, B> & MutableCharacterNode<V, B>,
169-
R extends MutableMapNode<Character, V, B> & MutableCharacterNode<V, B>
170-
>
165+
public abstract static class View<V, B extends Branch<V, B>, R extends Root<V, B>>
171166
implements MultiTrie<Character, V> {
172167
@Override
173168
public CharacterNode<V> getRoot() {

0 commit comments

Comments
 (0)