0
                         3
                         0
                     
                 
                    | ... | ... | 
		@@ -722,64 +722,67 @@  | 
| 722 | 722 | 
		/// Default constructor.  | 
| 723 | 723 | 
		/// You have to call save() to actually make a snapshot.  | 
| 724 | 724 | 
		Snapshot()  | 
| 725 | 725 | 
		: digraph(0), node_observer_proxy(*this),  | 
| 726 | 726 | 
		          arc_observer_proxy(*this) {}
	 | 
| 727 | 727 | 
		 | 
| 728 | 728 | 
		/// \brief Constructor that immediately makes a snapshot.  | 
| 729 | 729 | 
		///  | 
| 730 | 730 | 
		/// This constructor immediately makes a snapshot of the given digraph.  | 
| 731 | 731 | 
		Snapshot(ListDigraph &gr)  | 
| 732 | 732 | 
		: node_observer_proxy(*this),  | 
| 733 | 733 | 
		          arc_observer_proxy(*this) {
	 | 
| 734 | 734 | 
		attach(gr);  | 
| 735 | 735 | 
		}  | 
| 736 | 736 | 
		 | 
| 737 | 737 | 
		/// \brief Make a snapshot.  | 
| 738 | 738 | 
		///  | 
| 739 | 739 | 
		/// This function makes a snapshot of the given digraph.  | 
| 740 | 740 | 
		/// It can be called more than once. In case of a repeated  | 
| 741 | 741 | 
		/// call, the previous snapshot gets lost.  | 
| 742 | 742 | 
		      void save(ListDigraph &gr) {
	 | 
| 743 | 743 | 
		        if (attached()) {
	 | 
| 744 | 744 | 
		detach();  | 
| 745 | 745 | 
		clear();  | 
| 746 | 746 | 
		}  | 
| 747 | 747 | 
		attach(gr);  | 
| 748 | 748 | 
		}  | 
| 749 | 749 | 
		 | 
| 750 | 750 | 
		/// \brief Undo the changes until the last snapshot.  | 
| 751 | 751 | 
		///  | 
| 752 | 752 | 
		/// This function undos the changes until the last snapshot  | 
| 753 | 753 | 
		/// created by save() or Snapshot(ListDigraph&).  | 
| 754 | 
		///  | 
|
| 755 | 
		/// \warning This method invalidates the snapshot, i.e. repeated  | 
|
| 756 | 
		/// restoring is not supported unless you call save() again.  | 
|
| 754 | 757 | 
		      void restore() {
	 | 
| 755 | 758 | 
		detach();  | 
| 756 | 759 | 
		for(std::list<Arc>::iterator it = added_arcs.begin();  | 
| 757 | 760 | 
		            it != added_arcs.end(); ++it) {
	 | 
| 758 | 761 | 
		digraph->erase(*it);  | 
| 759 | 762 | 
		}  | 
| 760 | 763 | 
		for(std::list<Node>::iterator it = added_nodes.begin();  | 
| 761 | 764 | 
		            it != added_nodes.end(); ++it) {
	 | 
| 762 | 765 | 
		digraph->erase(*it);  | 
| 763 | 766 | 
		}  | 
| 764 | 767 | 
		clear();  | 
| 765 | 768 | 
		}  | 
| 766 | 769 | 
		 | 
| 767 | 770 | 
		/// \brief Returns \c true if the snapshot is valid.  | 
| 768 | 771 | 
		///  | 
| 769 | 772 | 
		/// This function returns \c true if the snapshot is valid.  | 
| 770 | 773 | 
		      bool valid() const {
	 | 
| 771 | 774 | 
		return attached();  | 
| 772 | 775 | 
		}  | 
| 773 | 776 | 
		};  | 
| 774 | 777 | 
		 | 
| 775 | 778 | 
		};  | 
| 776 | 779 | 
		 | 
| 777 | 780 | 
		///@}  | 
| 778 | 781 | 
		 | 
| 779 | 782 | 
		  class ListGraphBase {
	 | 
| 780 | 783 | 
		 | 
| 781 | 784 | 
		protected:  | 
| 782 | 785 | 
		 | 
| 783 | 786 | 
		    struct NodeT {
	 | 
| 784 | 787 | 
		int first_out;  | 
| 785 | 788 | 
		int prev, next;  | 
| ... | ... | 
		@@ -1521,59 +1524,62 @@  | 
| 1521 | 1524 | 
		/// Default constructor.  | 
| 1522 | 1525 | 
		/// You have to call save() to actually make a snapshot.  | 
| 1523 | 1526 | 
		Snapshot()  | 
| 1524 | 1527 | 
		: graph(0), node_observer_proxy(*this),  | 
| 1525 | 1528 | 
		          edge_observer_proxy(*this) {}
	 | 
| 1526 | 1529 | 
		 | 
| 1527 | 1530 | 
		/// \brief Constructor that immediately makes a snapshot.  | 
| 1528 | 1531 | 
		///  | 
| 1529 | 1532 | 
		/// This constructor immediately makes a snapshot of the given graph.  | 
| 1530 | 1533 | 
		Snapshot(ListGraph &gr)  | 
| 1531 | 1534 | 
		: node_observer_proxy(*this),  | 
| 1532 | 1535 | 
		          edge_observer_proxy(*this) {
	 | 
| 1533 | 1536 | 
		attach(gr);  | 
| 1534 | 1537 | 
		}  | 
| 1535 | 1538 | 
		 | 
| 1536 | 1539 | 
		/// \brief Make a snapshot.  | 
| 1537 | 1540 | 
		///  | 
| 1538 | 1541 | 
		/// This function makes a snapshot of the given graph.  | 
| 1539 | 1542 | 
		/// It can be called more than once. In case of a repeated  | 
| 1540 | 1543 | 
		/// call, the previous snapshot gets lost.  | 
| 1541 | 1544 | 
		      void save(ListGraph &gr) {
	 | 
| 1542 | 1545 | 
		        if (attached()) {
	 | 
| 1543 | 1546 | 
		detach();  | 
| 1544 | 1547 | 
		clear();  | 
| 1545 | 1548 | 
		}  | 
| 1546 | 1549 | 
		attach(gr);  | 
| 1547 | 1550 | 
		}  | 
| 1548 | 1551 | 
		 | 
| 1549 | 1552 | 
		/// \brief Undo the changes until the last snapshot.  | 
| 1550 | 1553 | 
		///  | 
| 1551 | 1554 | 
		/// This function undos the changes until the last snapshot  | 
| 1552 | 1555 | 
		/// created by save() or Snapshot(ListGraph&).  | 
| 1556 | 
		///  | 
|
| 1557 | 
		/// \warning This method invalidates the snapshot, i.e. repeated  | 
|
| 1558 | 
		/// restoring is not supported unless you call save() again.  | 
|
| 1553 | 1559 | 
		      void restore() {
	 | 
| 1554 | 1560 | 
		detach();  | 
| 1555 | 1561 | 
		for(std::list<Edge>::iterator it = added_edges.begin();  | 
| 1556 | 1562 | 
		            it != added_edges.end(); ++it) {
	 | 
| 1557 | 1563 | 
		graph->erase(*it);  | 
| 1558 | 1564 | 
		}  | 
| 1559 | 1565 | 
		for(std::list<Node>::iterator it = added_nodes.begin();  | 
| 1560 | 1566 | 
		            it != added_nodes.end(); ++it) {
	 | 
| 1561 | 1567 | 
		graph->erase(*it);  | 
| 1562 | 1568 | 
		}  | 
| 1563 | 1569 | 
		clear();  | 
| 1564 | 1570 | 
		}  | 
| 1565 | 1571 | 
		 | 
| 1566 | 1572 | 
		/// \brief Returns \c true if the snapshot is valid.  | 
| 1567 | 1573 | 
		///  | 
| 1568 | 1574 | 
		/// This function returns \c true if the snapshot is valid.  | 
| 1569 | 1575 | 
		      bool valid() const {
	 | 
| 1570 | 1576 | 
		return attached();  | 
| 1571 | 1577 | 
		}  | 
| 1572 | 1578 | 
		};  | 
| 1573 | 1579 | 
		};  | 
| 1574 | 1580 | 
		 | 
| 1575 | 1581 | 
		/// @}  | 
| 1576 | 1582 | 
		} //namespace lemon  | 
| 1577 | 1583 | 
		 | 
| 1578 | 1584 | 
		 | 
| 1579 | 1585 | 
		#endif  | 
| ... | ... | 
		@@ -257,64 +257,72 @@  | 
| 257 | 257 | 
		G.addArc(n3, n);  | 
| 258 | 258 | 
		G.addArc(n, n3);  | 
| 259 | 259 | 
		 | 
| 260 | 260 | 
		checkGraphNodeList(G, 4);  | 
| 261 | 261 | 
		checkGraphArcList(G, 6);  | 
| 262 | 262 | 
		 | 
| 263 | 263 | 
		snapshot.restore();  | 
| 264 | 264 | 
		 | 
| 265 | 265 | 
		checkGraphNodeList(G, 3);  | 
| 266 | 266 | 
		checkGraphArcList(G, 4);  | 
| 267 | 267 | 
		 | 
| 268 | 268 | 
		checkGraphOutArcList(G, n1, 1);  | 
| 269 | 269 | 
		checkGraphOutArcList(G, n2, 3);  | 
| 270 | 270 | 
		checkGraphOutArcList(G, n3, 0);  | 
| 271 | 271 | 
		 | 
| 272 | 272 | 
		checkGraphInArcList(G, n1, 1);  | 
| 273 | 273 | 
		checkGraphInArcList(G, n2, 1);  | 
| 274 | 274 | 
		checkGraphInArcList(G, n3, 2);  | 
| 275 | 275 | 
		 | 
| 276 | 276 | 
		checkGraphConArcList(G, 4);  | 
| 277 | 277 | 
		 | 
| 278 | 278 | 
		checkNodeIds(G);  | 
| 279 | 279 | 
		checkArcIds(G);  | 
| 280 | 280 | 
		checkGraphNodeMap(G);  | 
| 281 | 281 | 
		checkGraphArcMap(G);  | 
| 282 | 282 | 
		 | 
| 283 | 283 | 
		G.addNode();  | 
| 284 | 284 | 
		snapshot.save(G);  | 
| 285 | 285 | 
		 | 
| 286 | 286 | 
		G.addArc(G.addNode(), G.addNode());  | 
| 287 | 287 | 
		 | 
| 288 | 288 | 
		snapshot.restore();  | 
| 289 | 
		snapshot.save(G);  | 
|
| 290 | 
		 | 
|
| 291 | 
		checkGraphNodeList(G, 4);  | 
|
| 292 | 
		checkGraphArcList(G, 4);  | 
|
| 293 | 
		 | 
|
| 294 | 
		G.addArc(G.addNode(), G.addNode());  | 
|
| 295 | 
		 | 
|
| 296 | 
		snapshot.restore();  | 
|
| 289 | 297 | 
		 | 
| 290 | 298 | 
		checkGraphNodeList(G, 4);  | 
| 291 | 299 | 
		checkGraphArcList(G, 4);  | 
| 292 | 300 | 
		}  | 
| 293 | 301 | 
		 | 
| 294 | 302 | 
		void checkConcepts() {
	 | 
| 295 | 303 | 
		  { // Checking digraph components
	 | 
| 296 | 304 | 
		checkConcept<BaseDigraphComponent, BaseDigraphComponent >();  | 
| 297 | 305 | 
		 | 
| 298 | 306 | 
		checkConcept<IDableDigraphComponent<>,  | 
| 299 | 307 | 
		IDableDigraphComponent<> >();  | 
| 300 | 308 | 
		 | 
| 301 | 309 | 
		checkConcept<IterableDigraphComponent<>,  | 
| 302 | 310 | 
		IterableDigraphComponent<> >();  | 
| 303 | 311 | 
		 | 
| 304 | 312 | 
		checkConcept<MappableDigraphComponent<>,  | 
| 305 | 313 | 
		MappableDigraphComponent<> >();  | 
| 306 | 314 | 
		}  | 
| 307 | 315 | 
		  { // Checking skeleton digraph
	 | 
| 308 | 316 | 
		checkConcept<Digraph, Digraph>();  | 
| 309 | 317 | 
		}  | 
| 310 | 318 | 
		  { // Checking ListDigraph
	 | 
| 311 | 319 | 
		checkConcept<Digraph, ListDigraph>();  | 
| 312 | 320 | 
		checkConcept<AlterableDigraphComponent<>, ListDigraph>();  | 
| 313 | 321 | 
		checkConcept<ExtendableDigraphComponent<>, ListDigraph>();  | 
| 314 | 322 | 
		checkConcept<ClearableDigraphComponent<>, ListDigraph>();  | 
| 315 | 323 | 
		checkConcept<ErasableDigraphComponent<>, ListDigraph>();  | 
| 316 | 324 | 
		}  | 
| 317 | 325 | 
		  { // Checking SmartDigraph
	 | 
| 318 | 326 | 
		checkConcept<Digraph, SmartDigraph>();  | 
| 319 | 327 | 
		checkConcept<AlterableDigraphComponent<>, SmartDigraph>();  | 
| 320 | 328 | 
		checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();  | 
| ... | ... | 
		@@ -230,64 +230,73 @@  | 
| 230 | 230 | 
		G.addEdge(n3, n2);  | 
| 231 | 231 | 
		 | 
| 232 | 232 | 
		checkGraphNodeList(G, 4);  | 
| 233 | 233 | 
		checkGraphEdgeList(G, 6);  | 
| 234 | 234 | 
		checkGraphArcList(G, 12);  | 
| 235 | 235 | 
		 | 
| 236 | 236 | 
		snapshot.restore();  | 
| 237 | 237 | 
		 | 
| 238 | 238 | 
		checkGraphNodeList(G, 3);  | 
| 239 | 239 | 
		checkGraphEdgeList(G, 3);  | 
| 240 | 240 | 
		checkGraphArcList(G, 6);  | 
| 241 | 241 | 
		 | 
| 242 | 242 | 
		checkGraphIncEdgeArcLists(G, n1, 2);  | 
| 243 | 243 | 
		checkGraphIncEdgeArcLists(G, n2, 3);  | 
| 244 | 244 | 
		checkGraphIncEdgeArcLists(G, n3, 1);  | 
| 245 | 245 | 
		 | 
| 246 | 246 | 
		checkGraphConEdgeList(G, 3);  | 
| 247 | 247 | 
		checkGraphConArcList(G, 6);  | 
| 248 | 248 | 
		 | 
| 249 | 249 | 
		checkNodeIds(G);  | 
| 250 | 250 | 
		checkEdgeIds(G);  | 
| 251 | 251 | 
		checkArcIds(G);  | 
| 252 | 252 | 
		checkGraphNodeMap(G);  | 
| 253 | 253 | 
		checkGraphEdgeMap(G);  | 
| 254 | 254 | 
		checkGraphArcMap(G);  | 
| 255 | 255 | 
		 | 
| 256 | 256 | 
		G.addNode();  | 
| 257 | 257 | 
		snapshot.save(G);  | 
| 258 | 258 | 
		 | 
| 259 | 259 | 
		G.addEdge(G.addNode(), G.addNode());  | 
| 260 | 260 | 
		 | 
| 261 | 261 | 
		snapshot.restore();  | 
| 262 | 
		snapshot.save(G);  | 
|
| 263 | 
		 | 
|
| 264 | 
		checkGraphNodeList(G, 4);  | 
|
| 265 | 
		checkGraphEdgeList(G, 3);  | 
|
| 266 | 
		checkGraphArcList(G, 6);  | 
|
| 267 | 
		 | 
|
| 268 | 
		G.addEdge(G.addNode(), G.addNode());  | 
|
| 269 | 
		 | 
|
| 270 | 
		snapshot.restore();  | 
|
| 262 | 271 | 
		 | 
| 263 | 272 | 
		checkGraphNodeList(G, 4);  | 
| 264 | 273 | 
		checkGraphEdgeList(G, 3);  | 
| 265 | 274 | 
		checkGraphArcList(G, 6);  | 
| 266 | 275 | 
		}  | 
| 267 | 276 | 
		 | 
| 268 | 277 | 
		void checkFullGraph(int num) {
	 | 
| 269 | 278 | 
		typedef FullGraph Graph;  | 
| 270 | 279 | 
		GRAPH_TYPEDEFS(Graph);  | 
| 271 | 280 | 
		 | 
| 272 | 281 | 
		Graph G(num);  | 
| 273 | 282 | 
		check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,  | 
| 274 | 283 | 
		"Wrong size");  | 
| 275 | 284 | 
		 | 
| 276 | 285 | 
		G.resize(num);  | 
| 277 | 286 | 
		check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,  | 
| 278 | 287 | 
		"Wrong size");  | 
| 279 | 288 | 
		 | 
| 280 | 289 | 
		checkGraphNodeList(G, num);  | 
| 281 | 290 | 
		checkGraphEdgeList(G, num * (num - 1) / 2);  | 
| 282 | 291 | 
		 | 
| 283 | 292 | 
		  for (NodeIt n(G); n != INVALID; ++n) {
	 | 
| 284 | 293 | 
		checkGraphOutArcList(G, n, num - 1);  | 
| 285 | 294 | 
		checkGraphInArcList(G, n, num - 1);  | 
| 286 | 295 | 
		checkGraphIncEdgeList(G, n, num - 1);  | 
| 287 | 296 | 
		}  | 
| 288 | 297 | 
		 | 
| 289 | 298 | 
		checkGraphConArcList(G, num * (num - 1));  | 
| 290 | 299 | 
		checkGraphConEdgeList(G, num * (num - 1) / 2);  | 
| 291 | 300 | 
		 | 
| 292 | 301 | 
		checkArcDirections(G);  | 
| 293 | 302 | 
		 | 
0 comments (0 inline)