package graph;

import java.util.*;

public abstract class AbstractGraph implements Graph {

	private boolean directed;

	protected AbstractGraph(boolean directed) {
		this.directed = directed;
	}

	public final boolean isDirected() {
		return directed;
	}

	public int getNofVertices() {
		return getVertices().size();
	}

	public int getNofEdges() {
		int c = 0;
		Iterator it = getVertices().iterator();

		while (it.hasNext()) {
			Set av = getAdjacentVertices(it.next());
			c += av.size();
		}
		if (!isDirected())
			c /= 2;

		return c;
	}
	
	public abstract Object clone();
	
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("unweighted ");
		if (isDirected())
			sb.append("di");
		sb.append("graph:\n");

		Iterator it = getVertices().iterator();
		while (it.hasNext()) {
			Object from = it.next();
			sb.append(from + ":\t");

			Iterator eit = getAdjacentVertices(from).iterator();
			if (eit.hasNext()) {
				sb.append(eit.next());
				while (eit.hasNext()) {
					sb.append(", " + eit.next());
				}
			}
			sb.append('\n');
		}
		sb.append('\n');
		return sb.toString();
	}
}
