/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: AStarOpenListPriorityQueue2.java * Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3) * * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.routing.experimentalAStar3.storage; import java.util.Collection; import com.sun.electric.tool.routing.experimentalAStar3.algorithm.AStarMapBase; import com.sun.electric.tool.routing.experimentalAStar3.algorithm.AStarNode; import com.sun.electric.tool.routing.experimentalAStar3.algorithm.AStarOpenListBase; import com.sun.electric.tool.routing.experimentalAStar3.datastructures.PriorityQueue; /** * @author Michael Neumann * */ public class AStarOpenListPriorityQueue2 implements AStarOpenListBase<AStarNode> { private AStarNodePriorityQueue queue = new AStarNodePriorityQueue(); private AStarMapBase<AStarNode> map; public void setMap(AStarMapBase<AStarNode> map) { this.map = map; } public void addNodeToOpenList(AStarNode node) { node.markAsOpen(); if (node.pq_i == 0) queue.push(node); else queue.update(node); } public AStarNode findOpenNode(int x, int y, int z) { AStarNode node = map.nodeAt(x, y, z); if (node.isOpen()) return node; return null; } public boolean isOpenListEmpty() { return queue.empty(); } public AStarNode removeCheapestOpenNode() { if (queue.empty()) return null; AStarNode node = queue.top(); queue.pop(); node.markAsNoList(); assert(node.pq_i == 0); return node; } public Collection<AStarNode> dumpOpenList() { // XXX assert(false); //Collection<AStarNode> dump = new ArrayList<AStarNode>(queue); queue.clear(); return null; //return dump; } public void removeNodeFromOpenList(AStarNode node) { assert(node.isOpen()); node.markAsNoList(); queue.remove(node); } public void clearOpenList() { AStarNode elements[] = queue.getElements(); for (int i = 1; i <= queue.size(); ++i) { AStarNode e = elements[i]; e.markAsNoList(); e.pq_i = 0; } queue.setEmpty(); } } class AStarNodePriorityQueue extends PriorityQueue<AStarNode> { protected boolean less(AStarNode a, AStarNode b) { return a.getTotalCost() < b.getTotalCost(); } protected void set_index(AStarNode node, int new_index) { node.pq_i = new_index; } protected int get_index(AStarNode node) { return node.pq_i; } protected AStarNode[] alloc_array(int sz) { return new AStarNode[sz]; } }