Subject: [PATCH] #24075: TaggingPresetItem#matches
---
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
|
a
|
b
|
|
| 11 | 11 | import java.util.EnumSet; |
| 12 | 12 | import java.util.List; |
| 13 | 13 | import java.util.Map; |
| | 14 | import java.util.RandomAccess; |
| 14 | 15 | import java.util.Set; |
| 15 | 16 | |
| 16 | 17 | import javax.swing.ImageIcon; |
| … |
… |
|
| 170 | 171 | */ |
| 171 | 172 | public static boolean matches(Iterable<? extends TaggingPresetItem> data, Map<String, String> tags) { |
| 172 | 173 | boolean atLeastOnePositiveMatch = false; |
| 173 | | for (TaggingPresetItem item : data) { |
| 174 | | Boolean m = item.matches(tags); |
| 175 | | if (m != null && !m) |
| 176 | | return false; |
| 177 | | else if (m != null) { |
| 178 | | atLeastOnePositiveMatch = true; |
| | 174 | if (data instanceof List && data instanceof RandomAccess) { |
| | 175 | List<? extends TaggingPresetItem> items = (List<? extends TaggingPresetItem>) data; |
| | 176 | /* This is a memory allocation optimization, mostly for ArrayList. |
| | 177 | * In test runs, this reduced the memory cost for this method by 99%. |
| | 178 | * This appears to have also improved CPU cost for this method by ~10% as well. |
| | 179 | * The big win for CPU cost is in GC improvements, which was around 80%. |
| | 180 | * Overall improvement: 7.6 hours to 4.5 hours for validating a Colorado pbf extract (40% improvement). |
| | 181 | */ |
| | 182 | for (int i = 0; i < items.size(); i++) { // READ ABOVE: DO NOT REPLACE WITH ENHANCED FOR LOOP! |
| | 183 | TaggingPresetItem item = items.get(i); |
| | 184 | Boolean m = item.matches(tags); |
| | 185 | if (m != null && !m) { |
| | 186 | return false; |
| | 187 | } else if (m != null) { |
| | 188 | atLeastOnePositiveMatch = true; |
| | 189 | } |
| | 190 | } |
| | 191 | } else { |
| | 192 | for (TaggingPresetItem item : data) { |
| | 193 | Boolean m = item.matches(tags); |
| | 194 | if (m != null && !m) { |
| | 195 | return false; |
| | 196 | } else if (m != null) { |
| | 197 | atLeastOnePositiveMatch = true; |
| | 198 | } |
| 179 | 199 | } |
| 180 | 200 | } |
| 181 | 201 | return atLeastOnePositiveMatch; |