Renderer/src/main/java/electrosphere/util/ds/DirectedGraph.java
austin 73a5d79bc2
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
tests, datastructure, debug work
2024-09-08 21:39:54 -04:00

162 lines
3.7 KiB
Java

package electrosphere.util.ds;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* A directed graph
*/
public class DirectedGraph {
/**
* The list of nodes in the graph
*/
List<GraphNode> nodes;
/**
* Constructor
*/
public DirectedGraph(){
this.nodes = new LinkedList<GraphNode>();
}
/**
* Creates a node in the graph
* @param data The data in the node
* @return The node
*/
public GraphNode createNode(Object data){
GraphNode rVal = new GraphNode();
this.nodes.add(rVal);
return rVal;
}
/**
* Adds direction as a neighbor of source. Does not create a connection from direction to source
* @param source The source node
* @param direction The destination node
*/
public void pointNode(GraphNode source, GraphNode direction){
if(!source.containsNeighbor(direction)){
source.addNeighbor(direction);
}
}
/**
* Mutually connects two nodes
* @param node1 Node 1
* @param node2 Node 2
*/
public void connectNodes(GraphNode node1, GraphNode node2){
if(!node1.containsNeighbor(node2)){
node1.addNeighbor(node2);
}
if(!node2.containsNeighbor(node1)){
node2.addNeighbor(node1);
}
}
/**
* Destroys a node
* @param node The node to destroy
*/
public void destroyNode(GraphNode node){
for(GraphNode toEval : this.nodes){
if(toEval != node){
if(toEval.containsNeighbor(node)){
toEval.removeNeighbor(node);
}
}
}
this.nodes.remove(node);
}
/**
* Gets the nodes in the graph
* @return The list of all nodes in the graph
*/
public List<GraphNode> getNodes(){
return Collections.unmodifiableList(this.nodes);
}
/**
* A node in a graph
*/
public static class GraphNode {
/**
* The data at the node
*/
Object data;
/**
* The neighbors of this graph node
*/
List<GraphNode> neighbors;
/**
* Creates a graph node
* @param data The data to put in the node
*/
public GraphNode(Object data){
this.data = data;
this.neighbors = new LinkedList<GraphNode>();
}
/**
* Creates an empty graph node
*/
public GraphNode(){
this.data = null;
this.neighbors = new LinkedList<GraphNode>();
}
/**
* Gets the data at this node
* @return The data
*/
public Object getData(){
return this.data;
}
/**
* Gets the neighbors of this node
* @return The list of neighbors
*/
public List<GraphNode> getNeighbors(){
return this.neighbors;
}
/**
* Adds a neighbor to this node
* @param neighbor The neighbor
*/
public void addNeighbor(GraphNode neighbor){
this.neighbors.add(neighbor);
}
/**
* Removes a neighbor from this node
* @param neighbor THe neighbor
*/
public void removeNeighbor(GraphNode neighbor){
this.neighbors.remove(neighbor);
}
/**
* Checks if this node contains a given node as a neighbor
* @param node The potential neighbor to check
* @return true if the node is a neighbor, false otherwise
*/
public boolean containsNeighbor(GraphNode node){
return this.neighbors.contains(node);
}
}
}