Beispiel #1
0
/** An edge to be added to the tree must not belong to any tree (including this one). */
void
Tree::add (Tree::Edge* e)
  throw (Tree::DuplicateEdge, Tree::EdgeInUse, Tree::EmptyEdge, Tree::SecondParent, Tree::EmptyEndPoint)
{
  if (e == 0)
    throw EmptyEdge();
  if (edge_set.find(e) != edge_set.end())
    throw DuplicateEdge(e);
  if (e->in_use)
    throw EdgeInUse(e);
  if ((e->child_node == 0) || (e->parent_node == 0))
    throw EmptyEndPoint(e);
  if (e->child_node->incoming != 0)
      throw SecondParent(e);

  // insert the nodes if they don't already exist in the graph
  if (node_set.find(e->parent_node) == node_set.end())
    add(e->parent_node);
  if (node_set.find(e->child_node) == node_set.end())
    add(e->child_node);

  // insert the edge in the corresponding lists of the two nodes
  e->parent_node->outgoing.push_back(e);
  e->child_node->incoming = e;

  // finally, insert the edge itself in the tree
  e->in_use = true;
  edge_set.insert(e);
  preorder_needed = postorder_needed = rpostorder_needed = true;
}
Beispiel #2
0
//--------------------------------------------------------------------------------------------------------------------
void
Tree::remove (Tree::Edge* e)
  throw (Tree::NonexistentEdge, Tree::EmptyEdge)
{
  if (e == 0)
    throw EmptyEdge();
  if (edge_set.erase(e) == 0)
    throw NonexistentEdge(e);
  preorder_needed = postorder_needed = rpostorder_needed = true;
  e->in_use = false;
  deque_erase<Edge*>(e->parent_node->outgoing, e);
  e->child_node->incoming = 0;
}
Beispiel #3
0
//--------------------------------------------------------------------
void
Tree::removeEdge (OA_ptr<Tree::Edge>  e)
  throw (Tree::NonexistentEdge, Tree::EmptyEdge)
{
  if (e.ptrEqual(0)) {
    throw EmptyEdge();
  }
  if (edge_set->erase(e) == 0) {
    throw NonexistentEdge(e);
  }
  preorder_needed = postorder_needed = rpostorder_needed = true;
  e->in_use = false;
  deque_erase<OA_ptr<Edge> >(*(e->parent_node->outgoing), e);
  e->child_node->incoming = 0;
}
Beispiel #4
0
/*! An edge to be added to the tree must not belong to any tree 
    (including this one). */
void
Tree::addEdge(OA_ptr<Tree::Edge>  e)
  throw (Tree::DuplicateEdge, Tree::EdgeInUse, Tree::EmptyEdge, Tree::SecondParent, Tree::EmptyEndPoint)
{
  if (e.ptrEqual(0)) {
    throw EmptyEdge();
  }
  if (edge_set->find(e) != edge_set->end()) {
    throw DuplicateEdge(e);
  }
  if (e->in_use) {
    throw EdgeInUse(e);
  }
  if ((e->child_node.ptrEqual(0)) || (e->parent_node.ptrEqual(0))) {
    throw EmptyEndPoint(e);
  }
  if (!e->child_node->incoming.ptrEqual(0)) {
      throw SecondParent(e);
  }

  // insert the nodes if they don't already exist in the graph
  if (node_set->find(e->parent_node) == node_set->end()) {
    addNode(e->parent_node);
  }
  if (node_set->find(e->child_node) == node_set->end()) {
    addNode(e->child_node);
  }

  // insert the edge in the corresponding lists of the two nodes
  e->parent_node->outgoing->push_back(e);
  e->child_node->incoming = e;

  // finally, insert the edge itself in the tree
  e->in_use = true;
  edge_set->insert(e);
  preorder_needed = postorder_needed = rpostorder_needed = true;
}