| 109 | } |
| 110 | |
| 111 | bool Graph::checkValidity() const |
| 112 | { |
| 113 | MR_TIMER; |
| 114 | |
| 115 | #define CHECK(x) { assert(x); if (!(x)) return false; } |
| 116 | |
| 117 | CHECK( validVerts_.size() == neighboursPerVertex_.size() ); |
| 118 | CHECK( validEdges_.size() == endsPerEdge_.size() ); |
| 119 | |
| 120 | for ( auto v : validVerts_ ) |
| 121 | { |
| 122 | const auto & neis = neighboursPerVertex_[v]; |
| 123 | CHECK( std::is_sorted( neis.begin(), neis.end() ) ); |
| 124 | for ( auto e : neis ) |
| 125 | { |
| 126 | CHECK( e.valid() ); |
| 127 | CHECK( e < endsPerEdge_.size() ); |
| 128 | CHECK( validEdges_.test( e ) ); |
| 129 | const auto ends = endsPerEdge_[e]; |
| 130 | CHECK( ends.v0 == v || ends.v1 == v ); |
| 131 | const auto w = ends.otherEnd( v ); |
| 132 | CHECK( e == findEdge( v, w ) ); |
| 133 | CHECK( e == findEdge( w, v ) ); |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | for ( auto e : validEdges_ ) |
| 138 | { |
| 139 | const auto ends = endsPerEdge_[e]; |
| 140 | CHECK( ends.v0 && ends.v1 ); |
| 141 | CHECK( ends.v0 < ends.v1 ); |
| 142 | CHECK( ends.v0 < neighboursPerVertex_.size() ); |
| 143 | CHECK( validVerts_.test( ends.v0 ) ); |
| 144 | CHECK( ends.v1 < neighboursPerVertex_.size() ); |
| 145 | CHECK( validVerts_.test( ends.v1 ) ); |
| 146 | |
| 147 | CHECK( e == findEdge( ends.v0, ends.v1 ) ); |
| 148 | CHECK( e == findEdge( ends.v1, ends.v0 ) ); |
| 149 | } |
| 150 | |
| 151 | return true; |
| 152 | } |
| 153 | |
| 154 | } //namespace MR |