26 #ifndef MLN_UTIL_ADJACENCY_MATRIX_HH
27 # define MLN_UTIL_ADJACENCY_MATRIX_HH
39 # include <mln/core/image/image2d.hh>
40 # include <mln/util/set.hh>
41 # include <mln/util/ord_pair.hh>
42 # include <mln/trait/value_.hh>
43 # include <mln/metal/converts_to.hh>
44 # include <mln/debug/println.hh>
58 template <
typename V,
typename Q>
59 struct adjacency_matrix_impl_selector
62 typedef image2d<bool> adj_t;
65 adjacency_matrix_impl_selector(
const V& nelements);
68 void add(
const V& e1,
const V& e2);
71 void remove(
const V& e1,
const V& e2);
77 bool are_adjacent(
const V& e1,
const V& e2)
const;
80 std::ostream& print_data_(std::ostream& ostr)
const;
90 struct adjacency_matrix_impl_selector<V, metal::bool_<false> >
93 typedef util::set< util::ord_pair<V> > adj_t;
96 adjacency_matrix_impl_selector(
const V& nelements);
99 void add(
const V& e1,
const V& e2);
102 void remove(
const V& e1,
const V& e2);
108 bool are_adjacent(
const V& e1,
const V& e2)
const;
111 std::ostream& print_data_(std::ostream& ostr)
const;
135 template <
typename V = def::coord>
137 :
private mlc_converts_to(V,unsigned)::check_t,
138 public internal::adjacency_matrix_impl_selector<V, typename mlc_equal(mln_trait_value_quant(V),trait::value::quant::low)::eval>
140 typedef internal::adjacency_matrix_impl_selector<V, typename mlc_equal(mln_trait_value_quant(V),trait::value::quant::low)::eval>
158 const adj_t& hook_data_()
const;
164 template <
typename V>
166 operator<<(std::ostream& ostr, const adjacency_matrix<V>& adj);
170 # ifndef MLN_INCLUDE_ONLY
178 template <
typename V,
typename Q>
179 adjacency_matrix_impl_selector<V, Q>::adjacency_matrix_impl_selector(
const V& nelements)
180 : adj_(nelements, nelements)
185 template <
typename V,
typename Q>
187 adjacency_matrix_impl_selector<V, Q>::add(
const V& e1,
const V& e2)
189 mln_precondition(adj_.is_valid());
190 mln_precondition(e1 < adj_.nrows());
191 mln_precondition(e2 < adj_.nrows());
199 template <
typename V,
typename Q>
201 adjacency_matrix_impl_selector<V, Q>::remove(
const V& e1,
const V& e2)
203 mln_precondition(adj_.is_valid());
204 mln_precondition(e1 < adj_.nrows());
205 mln_precondition(e2 < adj_.nrows());
213 template <
typename V,
typename Q>
215 adjacency_matrix_impl_selector<V, Q>::clear()
217 mln_precondition(adj_.is_valid());
221 template <
typename V,
typename Q>
223 adjacency_matrix_impl_selector<V, Q>::are_adjacent(
const V& e1,
226 mln_precondition(adj_.is_valid());
227 mln_precondition(e1 < adj_.nrows());
228 mln_precondition(e2 < adj_.nrows());
235 template <
typename V,
typename Q>
237 adjacency_matrix_impl_selector<V, Q>::print_data_(std::ostream& ostr)
const
239 mln_precondition(adj_.is_valid());
249 template <
typename V>
250 adjacency_matrix_impl_selector<V, metal::bool_<false> >
251 ::adjacency_matrix_impl_selector(
const V& nelements)
255 nelements_ = nelements;
259 template <
typename V>
261 adjacency_matrix_impl_selector<V, metal::bool_<false> >
262 ::add(
const V& e1,
const V& e2)
264 mln_precondition(
int(e1) <
int(nelements_));
265 mln_precondition(
int(e2) <
int(nelements_));
269 template <
typename V>
271 adjacency_matrix_impl_selector<V, metal::bool_<false> >
272 ::remove(
const V& e1,
const V& e2)
274 mln_precondition(
int(e1) <
int(nelements_));
275 mln_precondition(
int(e2) <
int(nelements_));
280 template <
typename V>
282 adjacency_matrix_impl_selector<V, metal::bool_<false> >::clear()
287 template <
typename V>
289 adjacency_matrix_impl_selector<V, metal::bool_<false> >
290 ::are_adjacent(
const V& e1,
const V& e2)
const
292 mln_precondition(
int(e1) <
int(nelements_));
293 mln_precondition(
int(e2) <
int(nelements_));
297 template <
typename V>
299 adjacency_matrix_impl_selector<V, metal::bool_<false> >::print_data_(std::ostream& ostr)
const
307 template <
typename V>
314 template <
typename V>
321 template <
typename V>
323 operator<<(std::ostream& ostr, const adjacency_matrix<V>& adj)
325 return adj.print_data_(ostr);
329 # endif // ! MLN_UTIL_ADJACENCY_MATRIX_HH
336 #endif // ! MLN_UTIL_ADJACENCY_MATRIX_HH