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 klao@962: klao@962: namespace lemon { klao@962: namespace concept { klao@962: klao@962: /// \todo to be done klao@962: klao@962: struct BaseIterableUndirGraphConcept { deba@989: klao@1022: template klao@1022: struct Constraints { klao@962: klao@1022: typedef typename Graph::UndirEdge UndirEdge; klao@1022: typedef typename Graph::Edge Edge; klao@1022: typedef typename Graph::Node Node; klao@962: klao@1022: void constraints() { klao@1022: checkConcept(); klao@1022: checkConcept, UndirEdge >(); klao@962: klao@1022: /// \bug this should be base_and_derived: klao@1022: UndirEdge ue = e; klao@1022: ue = e; klao@1022: klao@1022: Node n; klao@1022: n = graph.target(ue); klao@1022: n = graph.source(ue); klao@1022: klao@1022: graph.first(ue); klao@1022: graph.next(ue); klao@1022: } klao@1022: const Graph &graph; klao@1022: Edge e; klao@1022: }; klao@1022: klao@962: }; klao@962: klao@1022: klao@962: struct IterableUndirGraphConcept { klao@962: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: /// \todo we don't need the iterable component to be base iterable klao@1022: /// Don't we really??? klao@1022: //checkConcept< BaseIterableUndirGraphConcept, Graph > (); klao@962: klao@1022: checkConcept (); klao@1021: klao@1022: typedef typename Graph::UndirEdge UndirEdge; klao@1022: typedef typename Graph::UndirEdgeIt UndirEdgeIt; klao@1022: typedef typename Graph::UndirIncEdgeIt UndirIncEdgeIt; klao@1022: klao@1022: checkConcept, UndirEdgeIt>(); klao@1022: checkConcept, UndirIncEdgeIt>(); klao@1022: } klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: struct MappableUndirGraphConcept { klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: klao@1022: struct Dummy { klao@1022: int value; klao@1022: Dummy() : value(0) {} klao@1022: Dummy(int _v) : value(_v) {} klao@1022: }; klao@1022: klao@1022: void constraints() { klao@1022: checkConcept(); klao@1022: klao@1022: typedef typename Graph::template UndirEdgeMap IntMap; klao@1022: checkConcept, klao@1022: IntMap >(); klao@1022: klao@1022: typedef typename Graph::template UndirEdgeMap BoolMap; klao@1022: checkConcept, klao@1022: BoolMap >(); klao@1022: klao@1022: typedef typename Graph::template UndirEdgeMap DummyMap; klao@1022: checkConcept, klao@1022: DummyMap >(); klao@1022: } klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: struct ExtendableUndirGraphConcept { klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: node_a = graph.addNode(); klao@1022: uedge = graph.addEdge(node_a, node_b); klao@1022: } klao@1022: typename Graph::Node node_a, node_b; klao@1022: typename Graph::UndirEdge uedge; klao@1022: Graph graph; klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: struct ErasableUndirGraphConcept { klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: graph.erase(n); klao@1022: graph.erase(e); klao@1022: } klao@1022: Graph graph; klao@1022: typename Graph::Node n; klao@1022: typename Graph::UndirEdge e; klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: class UndirGraph { klao@1022: public: klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: } klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: class ExtendableUndirGraph : public UndirGraph { klao@1022: public: klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: } klao@1022: }; klao@1022: klao@1022: }; klao@1022: klao@1022: class ErasableUndirGraph : public ExtendableUndirGraph { klao@1022: public: klao@1022: klao@1022: template klao@1022: struct Constraints { klao@1022: void constraints() { klao@1022: checkConcept(); klao@1022: checkConcept(); klao@1022: } klao@1022: }; klao@1022: klao@962: }; klao@962: klao@962: } klao@962: klao@962: } klao@962: klao@962: #endif