Changeset 14681 in josm for trunk/src/org


Ignore:
Timestamp:
2019-01-12T19:30:46+01:00 (6 years ago)
Author:
simon04
Message:

Refactoring: use LinkedList.descendingIterator in ExportRelationToGpxAction

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java

    r14434 r14681  
    1616import java.util.HashMap;
    1717import java.util.Iterator;
     18import java.util.LinkedList;
    1819import java.util.List;
    19 import java.util.ListIterator;
    2020import java.util.Map;
    2121import java.util.Set;
     
    3232import org.openstreetmap.josm.data.osm.Relation;
    3333import org.openstreetmap.josm.data.osm.RelationMember;
    34 import org.openstreetmap.josm.data.osm.Way;
    3534import org.openstreetmap.josm.gui.MainApplication;
    3635import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType;
     
    111110    }
    112111
    113     private static final class BidiIterableList {
    114         private final List<RelationMember> l;
    115 
    116         private BidiIterableList(List<RelationMember> l) {
    117             this.l = l;
    118         }
    119 
    120         public Iterator<RelationMember> iterator() {
    121             return l.iterator();
    122         }
    123 
    124         public Iterator<RelationMember> reverseIterator() {
    125             ListIterator<RelationMember> li = l.listIterator(l.size());
    126             return new Iterator<RelationMember>() {
    127                 @Override
    128                 public boolean hasNext() {
    129                     return li.hasPrevious();
    130                 }
    131 
    132                 @Override
    133                 public RelationMember next() {
    134                     return li.previous();
    135                 }
    136 
    137                 @Override
    138                 public void remove() {
    139                     li.remove();
    140                 }
    141             };
    142         }
    143     }
    144 
    145112    @Override
    146113    protected Layer getLayer() {
     
    149116        List<RelationMember> init = new ArrayList<>();
    150117        relations.forEach(t -> init.add(new RelationMember("", t)));
    151         BidiIterableList l = new BidiIterableList(init);
    152118
    153119        Stack<Iterator<RelationMember>> stack = new Stack<>();
    154         stack.push(mode.contains(FROM_FIRST_MEMBER) ? l.iterator() : l.reverseIterator());
     120        stack.push(modeAwareIterator(init));
    155121
    156122        List<Relation> relsFound = new ArrayList<>();
     
    162128                RelationMember m = i.next();
    163129                if (m.isRelation() && !m.getRelation().isIncomplete()) {
    164                     l = new BidiIterableList(m.getRelation().getMembers());
    165                     stack.push(mode.contains(FROM_FIRST_MEMBER) ? l.iterator() : l.reverseIterator());
     130                    final List<RelationMember> members = m.getRelation().getMembers();
     131                    stack.push(modeAwareIterator(members));
    166132                    relsFound.add(m.getRelation());
    167133                    break;
     
    196162                        }
    197163                        if (trkAttr.isEmpty()) {
    198                             Relation r = Way.getParentRelations(Arrays.asList(flat.get(i).getWay()))
    199                                     .stream().filter(relsFound::contains).findFirst().orElseGet(null);
    200                             if (r != null) {
    201                                 trkAttr.put("name", r.getName() != null ? r.getName() : r.getId());
    202                                 trkAttr.put("desc", tr("based on osm route relation data, timestamps are synthetic"));
    203                             }
     164                            flat.get(i).getWay().referrers(Relation.class)
     165                                    .filter(relsFound::contains)
     166                                    .findFirst()
     167                                    .ifPresent(r -> {
     168                                        trkAttr.put("name", r.getName() != null ? r.getName() : r.getId());
     169                                        trkAttr.put("desc", tr("based on osm route relation data, timestamps are synthetic"));
     170                                    });
    204171                            GpxData.ensureUniqueName(trkAttr, names);
    205172                        }
     
    225192    }
    226193
     194    private <T> Iterator<T> modeAwareIterator(List<T> list) {
     195        return mode.contains(FROM_FIRST_MEMBER)
     196                ? list.iterator()
     197                : new LinkedList<>(list).descendingIterator();
     198    }
     199
    227200    /**
    228201     *
Note: See TracChangeset for help on using the changeset viewer.