123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // (C) Copyright Andrew Sutton 2009
- //
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0 (See accompanying file
- // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- /***********************************************************
- IMPORTANT: this file should not be tested - it creates invalid graphs/sequences
- which *do* crash at runtime - this seems to be the intent, but it's not
- clear why or whether the file should be retained.
- ***********************************************************/
- #include <iostream>
- #include <string>
- #include <boost/graph/adjacency_list.hpp>
- #include "typestr.hpp"
- using namespace std;
- using namespace boost;
- // The purpose of this test is simply to provide a testing ground for the
- // invalidation of iterators and descriptors.
- template <typename Graph>
- void make_graph(Graph& g)
- {
- // Build a simple (barbell) graph.
- typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- Vertex u = add_vertex(10, g);
- Vertex v = add_vertex(20, g);
- add_edge(u, v, 100, g);
- }
- // Invalid iterators and descriptors will cause a segfault.
- template <typename Graph, typename Iterator, typename Descriptor>
- void test(Graph& g, Iterator i, Descriptor d, string const& str)
- {
- int x;
- cout << "... " << str << " iter" << endl;
- x = g[*i];
- // cout << "... " << x << endl;
- cout << "... " << str << " desc" << endl;
- x = g[d];
- // cout << "... " << x << endl;
- }
- template <typename Graph>
- void invalidate_edges()
- {
- typedef typename graph_traits<Graph>::edge_descriptor Edge;
- typedef typename graph_traits<Graph>::edge_iterator EdgeIterator;
- Graph g;
- make_graph(g);
- // The actual test. These are valid here.
- EdgeIterator i = edges(g).first;
- Edge e = *i;
- // Add a vertex, see what breaks.
- add_vertex(g);
- test(g, i, e, "edges");
- };
- template <typename Graph>
- void invalidate_vertices()
- {
- typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
- Graph g;
- make_graph(g);
- // The actual test. These are valid here.
- VertexIterator i = vertices(g).first;
- Vertex v = *i;
- // Add a vertex, see what breaks.
- add_vertex(g);
- test(g, i, v, "vertices");
- }
- template <typename Graph>
- void invalidate_out_edges()
- {
- typedef typename graph_traits<Graph>::edge_descriptor Edge;
- typedef typename graph_traits<Graph>::out_edge_iterator OutIterator;
- Graph g;
- make_graph(g);
- // The actual test. These are valid here.
- OutIterator i = out_edges(*vertices(g).first, g).first;
- Edge e = *i;
- // Add a vertex, see what breaks.
- add_vertex(g);
- test(g, i, e, "out edges");
- }
- template <typename Graph>
- void invalidate_adj_verts()
- {
- typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- typedef typename graph_traits<Graph>::adjacency_iterator AdjIterator;
- Graph g;
- make_graph(g);
- // The actual test. These are valid here.
- AdjIterator i = adjacent_vertices(*vertices(g).first, g).first;
- Vertex v = *i;
- // Add a vertex, see what breaks.
- add_vertex(g);
- test(g, i, v, "adjacent vertices");
- }
- int main()
- {
- typedef adjacency_list<vecS, vecS, undirectedS, int, int> VVU;
- cout << "vecS vecS undirectedS" << endl;
- invalidate_vertices<VVU>();
- invalidate_edges<VVU>();
- invalidate_out_edges<VVU>();
- invalidate_adj_verts<VVU>();
- typedef adjacency_list<vecS, vecS, bidirectionalS, int, int> VVB;
- cout << "vecS vecS bidirectionals" << endl;
- invalidate_vertices<VVB>();
- invalidate_edges<VVB>();
- invalidate_out_edges<VVB>();
- invalidate_adj_verts<VVB>();
- // If you comment out the tests before this, then adj_verts test will
- // run without segfaulting - at least under gcc-4.3. Not really sure why,
- // but I'm guessing it's still not generating valid results, and shouldn't
- // be taken as an indicator of stability.
- typedef adjacency_list<vecS, vecS, directedS, int, int> VVD;
- cout << "vecS vecS directedS" << endl;
- invalidate_vertices<VVD>();
- // invalidate_edges<VVD>();
- // invalidate_out_edges<VVD>();
- // invalidate_adj_verts<VVD>();
- typedef adjacency_list<listS, vecS, directedS, int, int> LVD;
- cout << "listS vecS directedS" << endl;
- invalidate_vertices<LVD>();
- // invalidate_edges<LVD>();
- // invalidate_out_edges<LVD>();
- // invalidate_adj_verts<LVD>();
- }
|