| 259 | */ |
| 260 | template<typename Graph, typename OutputIt, typename Pred> |
| 261 | OutputIt |
| 262 | pruneTips_if(Graph& g, OutputIt result, Pred p) |
| 263 | { |
| 264 | typedef typename graph_traits<Graph>::adjacency_iterator Vit; |
| 265 | typedef typename graph_traits<Graph>::vertex_iterator Uit; |
| 266 | typedef typename graph_traits<Graph>::vertex_descriptor V; |
| 267 | |
| 268 | /** Identify the tips. */ |
| 269 | std::vector<V> tips; |
| 270 | std::pair<Uit, Uit> urange = vertices(g); |
| 271 | for (Uit uit = urange.first; uit != urange.second; ++uit) { |
| 272 | V u = *uit; |
| 273 | if (out_degree(u, g) < 2) |
| 274 | continue; |
| 275 | std::pair<Vit, Vit> vrange = adjacent_vertices(u, g); |
| 276 | for (Vit vit = vrange.first; vit != vrange.second; ++vit) { |
| 277 | V v = *vit; |
| 278 | // assert(v != u); |
| 279 | if (out_degree(v, g) == 0 && p(v)) |
| 280 | tips.push_back(v); |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | /** Remove the tips. */ |
| 285 | remove_vertex_if(g, tips.begin(), tips.end(), True<V>()); |
| 286 | std::transform( |
| 287 | tips.begin(), tips.end(), result, [](const ContigNode& c) { return c.contigIndex(); }); |
| 288 | return result; |
| 289 | } |
| 290 | |
| 291 | /** Return true if the vertex is a normal 1-in 0-out tip. */ |
| 292 | template<typename Graph> |
no test coverage detected