27 #ifndef MLN_UTIL_LINE_GRAPH_HH
28 # define MLN_UTIL_LINE_GRAPH_HH
34 # include <mln/util/internal/graph_base.hh>
35 # include <mln/util/internal/graph_iter.hh>
36 # include <mln/util/internal/graph_nbh_iter.hh>
37 # include <mln/util/ord_pair.hh>
58 struct data< util::line_graph<G> >
60 typedef util::line_graph<G> lg_t;
61 typedef std::vector<std::vector<util::edge_id_t> > vertices_t;
62 typedef std::vector<util::ord_pair<util::vertex_id_t> > edges_t;
172 template <
typename G2>
206 template <
typename G2>
224 template <
typename G2>
228 const G&
graph()
const;
235 template <
typename G>
237 operator<<(std::ostream& ostr, const line_graph<G>& g);
243 # ifndef MLN_INCLUDE_ONLY
251 template <
typename G>
257 template <
typename G>
265 std::set<util::ord_pair<util::vertex_id_t> > edges_set;
267 vertices_.resize(g.e_nmax());
268 mln_edge_iter(G) e(g);
269 mln_edge_nbh_edge_iter(G) ne(e);
277 util::ord_pair<util::vertex_id_t>
edge(v1, v2);
278 if (edges_set.find(edge) == edges_set.end())
280 vertices_[v1].push_back(edges_.size());
281 vertices_[v2].push_back(edges_.size());
282 edges_set.insert(edge);
283 edges_.push_back(edge);
289 template <
typename G>
300 template <
typename G>
304 this->data_ =
new mln::internal::data< util::line_graph<G> >();
307 template <
typename G>
311 this->data_ =
new mln::internal::data< util::line_graph<G> >(g);
318 template <
typename G>
320 typename line_graph<G>::vertex_t
323 mln_assertion(has_v(id_v));
324 return vertex_t(*
this, id_v);
328 template <
typename G>
333 return data_->g_.e_nmax();
336 template <
typename G>
341 return data_->g_.has_v(id_v);
344 template <
typename G>
345 template <
typename G2>
351 return v.graph().is_subgraph_of(*
this) && has_v(v.id());
354 template <
typename G>
359 mln_precondition(has_v(id_v));
360 return data_->vertices_[id_v].size();
363 template <
typename G>
368 mln_precondition(has_v(id_v));
369 if (i >= v_nmax_nbh_edges(id_v))
371 return data_->vertices_[id_v][i];
374 template <
typename G>
379 mln_precondition(has_v(id_v));
380 return v_nmax_nbh_edges(id_v);
383 template <
typename G>
388 mln_precondition(has_v(id_v));
390 unsigned id_e = this->v_ith_nbh_edge(id_v, i);
391 return this->v_other(id_e, id_v);
399 template <
typename G>
401 typename line_graph<G>::edge_t
404 mln_assertion(e < e_nmax());
405 return edge_t(*
this, e);
408 template <
typename G>
413 return data_->edges_.size();
416 template <
typename G>
421 return id_e < data_->edges_.size();
424 template <
typename G>
425 template <
typename G2>
430 return e.graph().is_subgraph_of(*
this) && has_e(e.id());
433 template <
typename G>
438 mln_precondition(has_e(id_e));
439 return data_->edges_[id_e].first();
442 template <
typename G>
447 mln_precondition(has_e(id_e));
448 return data_->edges_[id_e].second();
451 template <
typename G>
456 mln_precondition(has_e(id_e));
457 return v_nmax_nbh_edges(v1(id_e)) + v_nmax_nbh_edges(v2(id_e));
460 template <
typename G>
465 mln_precondition(has_e(id_e));
466 if (i >= e_nmax_nbh_edges(id_e))
469 unsigned v1_nmax = v_nmax_nbh_edges(v1(id_e));
471 return v_ith_nbh_edge(v1(id_e), i);
472 return v_ith_nbh_edge(v2(id_e), i - v1_nmax);
476 template <
typename G>
477 template <
typename G2>
482 return g.id() == this->
id();
485 template <
typename G>
490 return this->data_->g_;
494 template <
typename G>
497 operator<<(std::ostream& ostr, const line_graph<G>& g)
499 typedef line_graph<G> LG;
500 mln_vertex_iter(LG) v(g);
501 mln_vertex_nbh_edge_iter(LG) e(v);
504 ostr <<
"v(" << v <<
") : ";
517 # endif // ! MLN_INCLUDE_ONLY
520 #endif // ! MLN_UTIL_LINE_GRAPH_HH