class ClassVertex<G extends WorkspaceGraph> extends Vertex<ClassReader> {
	protected final G graph;
	private ClassReader clazz;

	/**
	 * Constructs a class vertex from the containing graph and class reader.
	 *
	 * @param graph
	 * 		The containing graph.
	 * @param clazz
	 * 		The vertex data.
	 */
	public ClassVertex(G graph, ClassReader clazz) {
		this.clazz = clazz;
		this.graph = graph;
	}

	/**
	 * @return Name of class stored by the vertex.
	 */
	public String getClassName() {
		return clazz.getClassName();
	}

	@Override
	public ClassReader getData() {
		return clazz;
	}

	@Override
	public void setData(ClassReader clazz) {
		this.clazz = clazz;
	}

	@Override
	public int hashCode() {
		return getData().getClassName().hashCode();
	}

	@Override
	public boolean equals(Object other) {<FILL_FUNCTION_BODY>}

	@Override
	public String toString() {
		return getClassName();
	}

	// ============================== UTILITY =================================== //

	/**
	 * @param names
	 * 		Stream of names of classes.
	 *
	 * @return Mapped stream where names are replaced with instances.
	 * If a name has no instance mapping, it is discarded.
	 */
	protected Stream<ClassReader> getReadersFromNames(Stream<String> names) {
		return names.map(name -> {
			// Try loading from workspace
			ClassReader reader = graph.getWorkspace().getClassReader(name);
			if(reader != null)
				return reader;
			// Try loading from runtime
			return ClassUtil.fromRuntime(name);
		}).filter(Objects::nonNull);
	}
}

		if(other == null)
			throw new IllegalStateException("ClassVertex should not be compared to null");
		if(this == other)
			return true;
		if(other instanceof ClassVertex) {
			ClassVertex otherVertex = (ClassVertex) other;
			return getData().getClassName().equals(otherVertex.getData().getClassName());
		}
		return false;
	
<methods>public non-sealed void <init>() ,public abstract boolean equals(java.lang.Object) ,public Stream<Vertex<ClassReader>> getAllDirectedChildren(boolean) ,public Stream<Vertex<ClassReader>> getAllDirectedParents(boolean) ,public Stream<Vertex<ClassReader>> getAllLeaves() ,public Stream<Vertex<ClassReader>> getAllRoots() ,public Stream<Edge<ClassReader>> getApplicableEdges(boolean) ,public abstract ClassReader getData() ,public Stream<Vertex<ClassReader>> getDirectedChildren() ,public Stream<DirectedEdge<ClassReader>> getDirectedEdges(boolean) ,public Stream<Vertex<ClassReader>> getDirectedParents() ,public abstract Set<Edge<ClassReader>> getEdges() ,public Stream<Edge<ClassReader>> getUndirectedEdges() ,public abstract int hashCode() ,public boolean isLeaf() ,public boolean isRoot() ,public abstract void setData(ClassReader) <variables>