// graph.C
// ----------------------------------------------------------------
// COMP 290-001: Algorithm Library Design, Lutz Kettner, 01/11/2000
// Graph example illustrating a simple solution for mutual dependencies 
// between class templates. Implements adjacency lists.
// Note that const-correctness is a difficult issue here and not 
// addressed in this example.

// forward declaration
template <class A, class B>
struct Edge;

template <class A, class B>
struct Node {
    Edge<A,B> * edge;
    A aux;
};

// specialize node for empty aux data (void)
template <class B>
struct Node<void,B> {
    Edge<void,B> * edge;
};

template <class A, class B>
struct Edge {
    Node<A,B> * node;
    B aux;
};

// specialize edge for empty aux data (void)
template <class A>
struct Edge<A,void> {
    Node<A,void> * node;
};

template <class A, class B>
struct Graph {
    typedef Node<A,B> Node_type;
    typedef Edge<A,B> Edge_type;
};


int main() {
    {
	// test
	Graph<int,double> graph;
	Graph<int,double>::Node_type node;
	Graph<int,double>::Edge_type edge;
	node.edge = & edge;
	edge.node = & node;
	node.aux = 5;
	edge.aux = 6.6;
    }
    {
	// test specializations
	Graph<void,void> graph;
	Graph<void,void>::Node_type node;
	Graph<void,void>::Edge_type edge;
	node.edge = & edge;
	edge.node = & node;
    }
}

// EOF //



