Changeset 8740 in josm for trunk/src/org


Ignore:
Timestamp:
2015-09-09T13:03:32+02:00 (5 years ago)
Author:
simon04
Message:

fix #11834 - Use visitor pattern for key/value lookup (patch by michael2402, slightly modified)

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java

    r8735 r8740  
    2727public abstract class AbstractPrimitive implements IPrimitive {
    2828
     29    /**
     30     * This is a visitor that can be used to loop over the keys/values of this primitive.
     31     *
     32     * @author Michael Zangl
     33     * @since 8740
     34     */
     35    public interface KeyValueVisitor {
     36
     37        /**
     38         * This method gets called for every tag received.
     39         *
     40         * @param key   The key
     41         * @param value The value
     42         */
     43        void visitKeyValue(String key, String value);
     44    }
     45
    2946    private static final AtomicLong idCounter = new AtomicLong(0);
    3047
     
    477494     * @return tags of this primitive. Changes made in returned map are not mapped
    478495     * back to the primitive, use setKeys() to modify the keys
     496     * @see #visitKeys(KeyValueVisitor)
    479497     */
    480498    @Override
     
    489507        }
    490508        return result;
     509    }
     510
     511    /**
     512     * Calls the visitor for every key/value pair of this primitive.
     513     *
     514     * @param visitor The visitor to call.
     515     * @see #getKeys()
     516     * @since 8740
     517     */
     518    public void visitKeys(KeyValueVisitor visitor) {
     519        final String[] keys = this.keys;
     520        if (keys != null) {
     521            for (int i = 0; i < keys.length; i += 2) {
     522                visitor.visitKeyValue(keys[i], keys[i + 1]);
     523            }
     524        }
    491525    }
    492526
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

    r8509 r8740  
    3030import org.openstreetmap.josm.Main;
    3131import org.openstreetmap.josm.data.Version;
     32import org.openstreetmap.josm.data.osm.AbstractPrimitive.KeyValueVisitor;
    3233import org.openstreetmap.josm.data.osm.Node;
    3334import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    145146         * @author Michael Zangl
    146147         */
    147         private final class RuleCandidatesIterator implements Iterator<MapCSSRule> {
     148        private final class RuleCandidatesIterator implements Iterator<MapCSSRule>, KeyValueVisitor {
    148149            private final BitSet ruleCandidates;
    149150            private int next;
     
    151152            private RuleCandidatesIterator(BitSet ruleCandidates) {
    152153                this.ruleCandidates = ruleCandidates;
    153                 next = ruleCandidates.nextSetBit(0);
    154154            }
    155155
     
    169169            public void remove() {
    170170                throw new UnsupportedOperationException();
     171            }
     172
     173            @Override
     174            public void visitKeyValue(String key, String value) {
     175                MapCSSKeyRules v = index.get(key);
     176                if (v != null) {
     177                    BitSet rs = v.get(value);
     178                    ruleCandidates.or(rs);
     179                }
     180            }
     181
     182            /**
     183             * Call this before using the iterator.
     184             */
     185            public void prepare() {
     186                next = ruleCandidates.nextSetBit(0);
    171187            }
    172188        }
     
    318334            ruleCandidates.or(remaining);
    319335
    320             for (Map.Entry<String, String> e : osm.getKeys().entrySet()) {
    321                 MapCSSKeyRules v = index.get(e.getKey());
    322                 if (v != null) {
    323                     BitSet rs = v.get(e.getValue());
    324                     ruleCandidates.or(rs);
    325                 }
    326             }
    327             return new RuleCandidatesIterator(ruleCandidates);
     336            final RuleCandidatesIterator candidatesIterator = new RuleCandidatesIterator(ruleCandidates);
     337            osm.visitKeys(candidatesIterator);
     338            candidatesIterator.prepare();
     339            return candidatesIterator;
    328340        }
    329341
Note: See TracChangeset for help on using the changeset viewer.