Skip to content

Commit be9a980

Browse files
committed
Use parallel linear storage of placeholders and suppliers
1 parent 813ac53 commit be9a980

1 file changed

Lines changed: 9 additions & 14 deletions

File tree

smithy-utils/src/main/java/software/amazon/smithy/utils/AbstractCodeWriter.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.Deque;
1212
import java.util.HashMap;
1313
import java.util.Iterator;
14-
import java.util.LinkedHashMap;
1514
import java.util.List;
1615
import java.util.Map;
1716
import java.util.Objects;
@@ -622,7 +621,8 @@ public abstract class AbstractCodeWriter<T extends AbstractCodeWriter<T>> {
622621
private boolean trailingNewline = true;
623622
private int trimBlankLines = -1;
624623
private boolean enableStackTraceComments;
625-
private final Map<String, Supplier<String>> deferredValues = new LinkedHashMap<>();
624+
private final List<String> deferredPlaceholders = new ArrayList<>();
625+
private final List<Supplier<String>> deferredSuppliers = new ArrayList<>();
626626
private int deferredCounter = 0;
627627

628628
/**
@@ -789,30 +789,24 @@ public String toString() {
789789
String result = currentState.toString();
790790

791791
// Resolve any deferred values.
792-
if (!deferredValues.isEmpty()) {
792+
if (!deferredPlaceholders.isEmpty()) {
793793
// Find all sentinel positions, then resolve in a single linear pass.
794794
List<int[]> positions = new ArrayList<>();
795-
int idx = 0;
796-
for (Map.Entry<String, Supplier<String>> entry : deferredValues.entrySet()) {
797-
String key = entry.getKey();
795+
for (int i = 0; i < deferredPlaceholders.size(); i++) {
796+
String key = deferredPlaceholders.get(i);
798797
int fromIndex = 0;
799798
while ((fromIndex = result.indexOf(key, fromIndex)) != -1) {
800-
// Store [position, index-into-entries-list, key-length]
801-
positions.add(new int[]{fromIndex, idx, key.length()});
799+
positions.add(new int[]{fromIndex, i, key.length()});
802800
fromIndex += key.length();
803801
}
804-
idx++;
805802
}
806803
if (!positions.isEmpty()) {
807804
positions.sort((a, b) -> Integer.compare(a[0], b[0]));
808-
// Build list of suppliers indexed by insertion order for O(1) lookup.
809-
@SuppressWarnings("unchecked")
810-
Supplier<String>[] suppliers = deferredValues.values().toArray(new Supplier[0]);
811805
StringBuilder resolved = new StringBuilder(result.length());
812806
int pos = 0;
813807
for (int[] entry : positions) {
814808
resolved.append(result, pos, entry[0]);
815-
resolved.append(suppliers[entry[1]].get());
809+
resolved.append(deferredSuppliers.get(entry[1]).get());
816810
pos = entry[0] + entry[2];
817811
}
818812
resolved.append(result, pos, result.length());
@@ -1810,7 +1804,8 @@ public final String format(Object content, Object... args) {
18101804
*/
18111805
protected final String defer(Supplier<String> supplier) {
18121806
String id = "\u0000\u0000" + (deferredCounter++) + "\u0000\u0000";
1813-
deferredValues.put(id, supplier);
1807+
deferredPlaceholders.add(id);
1808+
deferredSuppliers.add(supplier);
18141809
return id;
18151810
}
18161811

0 commit comments

Comments
 (0)