klao@962: /* -*- C++ -*-
klao@962:  *
klao@962:  * src/lemon/concept/undir_graph_component.h - Part of LEMON, a generic
klao@962:  * C++ optimization library
klao@962:  *
klao@962:  * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi
klao@962:  * Kutatocsoport (Egervary Combinatorial Optimization Research Group,
klao@962:  * EGRES).
klao@962:  *
klao@962:  * Permission to use, modify and distribute this software is granted
klao@962:  * provided that this copyright notice appears in all copies. For
klao@962:  * precise terms see the accompanying LICENSE file.
klao@962:  *
klao@962:  * This software is provided "AS IS" with no warranty of any kind,
klao@962:  * express or implied, and with no claim as to its suitability for any
klao@962:  * purpose.
klao@962:  *
klao@962:  */
klao@962: 
klao@962: ///\ingroup concept
klao@962: ///\file
klao@962: ///\brief Undirected graphs and components of.
klao@962: 
klao@962: 
klao@962: #ifndef LEMON_CONCEPT_UNDIR_GRAPH_H
klao@962: #define LEMON_CONCEPT_UNDIR_GRAPH_H
klao@962: 
klao@962: #include <lemon/concept/graph_component.h>
klao@962: 
klao@962: namespace lemon {
klao@962:   namespace concept {
klao@962: 
klao@962:     /// \todo to be done
klao@962:     class BaseIterableUndirGraph;
klao@962: 
klao@962:     template <typename Graph>
klao@962:     struct BaseIterableUndirGraphConcept {
klao@962:       typedef typename Graph::UndirEdge UndirEdge;
klao@962:       typedef typename Graph::Edge Edge;
klao@962:       typedef typename Graph::Node Node;
klao@962:       void constraints() {
klao@962: 	function_requires< BaseIterableGraphComponentConcept<Graph> >();
klao@962: 	function_requires< GraphItemConcept<UndirEdge> >();
klao@962: 
klao@962: 	/// \bug this should be base_and_derived:
klao@962: 	UndirEdge ue = e;
klao@962: 	ue = e;
klao@962: 
klao@962: 	Node n;
klao@962: 	n = graph.head(ue);
klao@962: 	n = graph.tail(ue);
klao@962: 
klao@962: 	graph.first(ue);
klao@962: 	graph.next(ue);
klao@962:       }
klao@962:       const Graph &graph;
klao@962:       Edge e;
klao@962:     };
klao@962: 
klao@962:     template <typename Graph>
klao@962:     struct IterableUndirGraphConcept {
klao@962:       void constraints() {
klao@962: 	function_requires< BaseIterableUndirGraphConcept<Graph> > ();
klao@962: 	function_requires< IterableGraphComponentConcept<Graph> > ();
klao@962: 
klao@962: 	typedef typename Graph::UndirEdge UndirEdge;
klao@962: 	typedef typename Graph::UndirEdgeIt UndirEdgeIt;
klao@962: 
klao@962: 	function_requires<
klao@962: 	  GraphIteratorConcept<UndirEdgeIt, Graph, UndirEdge> >();
klao@962:       }
klao@962:     };
klao@962: 
klao@962:   }
klao@962: 
klao@962: }
klao@962: 
klao@962: #endif