Changeset 2441 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2009-11-12T22:09:45+01:00 (15 years ago)
Author:
jttt
Message:

Make sure primitive is returned only once by QuadBuckets.search (search_cache was changed during search call which sometimes caused QLevel to be scanned again)

File:
1 edited

Legend:

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

    r2440 r2441  
    361361        private List<T> search_contents(BBox search_bbox)
    362362        {
    363             String size = "null";
    364             if (content != null) {
    365                 size = ""+content.size();
    366             }
    367             if (debug) {
    368                 out("searching contents (size: "+size+") for " + search_bbox);
     363            if (debug) {
     364                out("searching contents (size: " + content == null?"<null>":content.size() + ") for " + search_bbox);
    369365            }
    370366            /*
     
    441437        boolean hasContent()
    442438        {
    443             if (content == null)
    444                 return false;
    445             return true;
     439            return content != null;
    446440        }
    447441        QBLevel nextSibling()
     
    469463            QBLevel ret = null;
    470464            for (QBLevel child : this.children) {
    471                 if (child == null)
     465                if (child == null) {
    472466                    continue;
     467                }
    473468                ret = child;
    474469                break;
     
    494489                    out("["+next.level+"] next node ("+next+") is a branch (content: "+next.hasContent()+"), moving down...");
    495490                }
    496                 if (child == null)
     491                if (child == null) {
    497492                    abort("branch node had no children");
     493                }
    498494                next = child;
    499495            }
     
    11051101    {
    11061102        BBox bbox = new BBox(point.lon() - radius, point.lat() - radius,
    1107                              point.lon() + radius, point.lat() + radius);
     1103                point.lon() + radius, point.lat() + radius);
    11081104        if (debug) {
    11091105            out("search bbox before sanity: " +  bbox);
     
    11691165            search_cache = root;
    11701166        }
     1167
     1168        // Save parent because search_cache might change during search call
     1169        QBLevel tmp = search_cache.parent;
     1170
    11711171        ret = search_cache.search(search_bbox);
    11721172        if (ret == null) {
    11731173            ret = new ArrayList<T>();
    11741174        }
     1175
    11751176        // A way that spans this bucket may be stored in one
    11761177        // of the nodes which is a parent of the search cache
    1177         QBLevel tmp = search_cache.parent;
    11781178        while (tmp != null) {
    11791179            List<T> content_result = tmp.search_contents(search_bbox);
     
    11881188        return ret;
    11891189    }
     1190
     1191    public void printTree() {
     1192        printTreeRecursive(root, 0);
     1193    }
     1194
     1195    private void printTreeRecursive(QBLevel level, int indent) {
     1196        if (level == null) {
     1197            printIndented(indent, "<empty child>");
     1198            return;
     1199        }
     1200        printIndented(indent, level);
     1201        if (level.hasContent()) {
     1202            for (T o:level.content) {
     1203                printIndented(indent, o);
     1204            }
     1205        }
     1206        if (level.children != null) {
     1207            for (QBLevel child:level.children) {
     1208                printTreeRecursive(child, indent + 2);
     1209            }
     1210        }
     1211    }
     1212
     1213    private void printIndented(int indent, Object msg) {
     1214        for (int i=0; i<indent; i++) {
     1215            System.out.print(' ');
     1216        }
     1217        System.out.println(msg);
     1218    }
    11901219}
Note: See TracChangeset for help on using the changeset viewer.