// @(#)$Id: DirectedGraph.C,v 1.4 1999/04/11 15:57:35 leavens Exp $

#include "DirectedGraph.h"

template<class Node>
DirectedGraph<Node>::DirectedGraph() throw() 
  : Graph<Node>(Set<Node>()), the_arcs(Set<Arc>())
{
}

template<class Node>
DirectedGraph<Node>::~DirectedGraph() throw()
{
}

template<class Node>
DirectedGraph<Node>& DirectedGraph<Node>::addArc(Node n, Node m) throw()
{
  the_arcs.add(Arc(n, m));
}

template<class Node>
DirectedGraph<Node>& DirectedGraph<Node>::removeArc(Node n, Node m) throw()
{
  the_arcs.remove(Arc(n, m));
}

template<class Node>
Set<Node>& DirectedGraph<Node>::adjacentNodesFrom(Node n) const throw()
{
  Set<Node>& ret = *(new Set<Node>());
  Set<Arc> es = the_arcs;
  while (!(es.isEmpty())) {
    Arc e = es.ident(choose)();
    if (e.source == n) {
      ret.add(e.target);
    }
    es.remove(e);
  }
  return ret;
}

template<class Node>
Set<Node>& DirectedGraph<Node>::adjacentNodesTo(Node n) const throw()
{
  Set<Node>& ret = *(new Set<Node>());
  Set<Arc> es = the_arcs;
  while (!(es.isEmpty())) {
    Arc e = es.ident(choose)();
    if (e.target == n) {
      ret.add(e.source);
    }
    es.remove(e);
  }
  return ret;
}

template<class Node>
Set<Node>& DirectedGraph<Node>::adjacentNodes(Node n) const throw()
{
  Set<Node>& f = adjacentNodesFrom(n);
  Set<Node>& t = adjacentNodesTo(n);
  Set<Node>& ret = union_of(f, t);
  delete f;
  delete t;
  return ret;
}


