11package org .quiltmc .enigma .util .multi_trie ;
22
33import 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
77import java .util .Optional ;
88import java .util .function .BiFunction ;
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