/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.asakusafw.utils.graph;
import java.util.Collection;
import java.util.Set;
/**
* Represents a directed graph.
* This identifies each vertex value by using its {@link Object#equals(Object)}.
* @param <V> the vertex value type
* @see Graphs
*/
public interface Graph<V> extends Iterable<Graph.Vertex<V>> {
/**
* Adds a directed edge from the {@code source} to {@code destination}.
* This method ignores the edge if it is already in this graph.
* This method also {@link #addNode(Object)} {@code source} and {@code destination} vertices to this graph
* if they are not in this graph.
* @param source the source vertex value (predecessor)
* @param destination the destination vertex value (successor)
*/
void addEdge(V source, V destination);
/**
* Adds directed edges from the {@code source} to each vertex in {@code destinations}.
* This method ignores an edge if it is already in this graph.
* This method also {@link #addNode(Object)} {@code source} and each vertex in {@code destinations} to this graph
* if they are not in this graph.
* If {@code destinations} is an empty collection, this method will only add the {@code source} vertex
* to this graph, and not add any edges.
* @param source the tail vertex value (predecessor)
* @param destinations the head vertex values (successors)
* @throws IllegalArgumentException if {@code to} is {@code null}
*/
void addEdges(V source, Collection<? extends V> destinations);
/**
* Adds a vertex.
* This method ignores the vertex if it is already in this graph.
* @param node the vertex value
*/
void addNode(V node);
/**
* Removes the all vertices and edges in this graph.
*/
void clear();
/**
* Returns whether this graph contains the target vertex or not.
* @param node the target vertex value
* @return {@code true} if this graph contains the target vertex, otherwise {@code false}
*/
boolean contains(Object node);
/**
* Returns the vertices which are direct successors of the specified vertex.
* If the vertex is not in this graph, this method will return an empty set.
* Clients should not modify the resulting set.
* @param key the target vertex value
* @return the successors of the specified vertex
*/
Set<V> getConnected(Object key);
/**
* Returns the all vertices in this graph.
* Clients should not modify the resulting set.
* @return the all vertices in this graph
*/
Set<V> getNodeSet();
/**
* Returns whether this graph contains the edge from {@code source} to {@code destination} or not.
* @param source the source vertex value (predecessor)
* @param destination the destination vertex value (successor)
* @return {@code true} if this graph contains the edge from {@code source} to {@code destination},
* otherwise {@code false}
*/
boolean isConnected(Object source, Object destination);
/**
* Returns whether this graph is empty or not.
* @return {@code true} if this graph does not contains any vertices, otherwise {@code false}
*/
boolean isEmpty();
/**
* Removes the edge from {@code source} to {@code destination} in this graph.
* If this graph does not contain such the edge, this method will do nothing.
* @param source the source vertex value (predecessor)
* @param destination the destination vertex value (successor)
*/
void removeEdge(Object source, Object destination);
/**
* Removes the vertex in this graph.
* This method also removes edges which are connected to the target vertex.
* If this graph does not contain such the vertex, this method will do nothing.
* @param node the target vertex value
*/
void removeNode(Object node);
/**
* Removes the vertices in this graph.
* If this method also removes edges which are connected to vertex in the specified collection.
* This method ignores vertices which are not in this graph.
* @param nodes the target vertices
* @throws IllegalArgumentException if the parameter is {@code null}
*/
void removeNodes(Collection<?> nodes);
/**
* Represents a vertex and its successor.
* @param <V> the vertex value type
*/
public interface Vertex<V> {
/**
* Returns the succeeding vertices from this vertex.
* Clients should not modify the resulting set.
* @return the successors
*/
Set<V> getConnected();
/**
* Returns the vertex value.
* @return the vertex value
*/
V getNode();
}
}