Ticket #24075: 24075.TaggingPresetItem#matches.patch

File 24075.TaggingPresetItem#matches.patch, 2.6 KB (added by taylor.smock, 17 months ago)

TaggingPresetItem#matches changes only

  • src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java

    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  
    1111import java.util.EnumSet;
    1212import java.util.List;
    1313import java.util.Map;
     14import java.util.RandomAccess;
    1415import java.util.Set;
    1516
    1617import javax.swing.ImageIcon;
     
    170171     */
    171172    public static boolean matches(Iterable<? extends TaggingPresetItem> data, Map<String, String> tags) {
    172173        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                }
    179199            }
    180200        }
    181201        return atLeastOnePositiveMatch;