27 #ifndef SCRIBO_CORE_LINE_SET_HH
28 # define SCRIBO_CORE_LINE_SET_HH
34 # include <mln/util/array.hh>
36 # include <mln/accu/pair.hh>
37 # include <mln/accu/center.hh>
38 # include <mln/accu/shape/bbox.hh>
40 # include <mln/labeling/compute.hh>
41 # include <mln/make/relabelfun.hh>
43 # include <mln/fun/i2v/array.hh>
45 # include <mln/convert/from_to.hh>
48 # include <scribo/core/macros.hh>
49 # include <scribo/core/line_info.hh>
51 # include <scribo/core/object_links.hh>
52 # include <scribo/core/object_groups.hh>
59 template <
typename L>
class line_set;
60 template <
typename L>
class line_info;
133 template <
typename F>
137 template <
typename F>
187 template <
typename L>
191 template <
typename L>
193 operator<<(std::ostream& ostr, const line_set<L>& lines);
198 template <
typename L>
206 # ifndef MLN_INCLUDE_ONLY
217 template <
typename L>
219 line_set_data<L>::line_set_data()
224 template <
typename L>
226 line_set_data<L>::line_set_data(
const object_groups<L>& groups)
227 : components_(groups.
components()), links_(groups.links()),
233 template <
typename L>
236 const object_groups<L>& groups)
237 : infos_(infos), components_(groups.
components()),
238 links_(groups.links()), groups_(groups)
247 template <
typename L>
249 line_set<L>::line_set()
254 template <
typename L>
256 line_set<L>::line_set(
const object_groups<L>& groups)
258 compute_lines(groups);
262 template <
typename L>
264 line_set<L>::line_set(
const object_groups<L>& groups,
267 data_ =
new internal::line_set_data<L>(line_data, groups);
271 template <
typename L>
273 line_set<L>::compute_lines(
const object_groups<L>& groups)
275 data_ =
new internal::line_set_data<L>(groups);
278 data_->infos_.reserve(groups.nelements());
279 data_->infos_.append(line_info<L>());
281 for_all_groups(i, groups)
284 line_info<L>
info(*
this, i, groups(i));
285 data_->infos_.append(
info);
291 template <
typename L>
294 line_set<L>::nelements()
const
296 return data_->infos_.nelements() - 1;
299 template <
typename L>
302 line_set<L>::info(
const mln_value(L)&
id)
const
304 return this->data_->infos_[id];
307 template <
typename L>
310 line_set<L>::info(
const mln_value(L)&
id)
312 return this->data_->infos_[id];
315 template <
typename L>
318 line_set<L>::operator()(
const line_id_t&
id)
const
320 return this->data_->infos_[id];
323 template <
typename L>
326 line_set<L>::operator()(
const line_id_t&
id)
328 return this->data_->infos_[id];
331 template <
typename L>
333 line_set<L>::infos()
const
335 return this->data_->infos_;
338 template <
typename L>
339 template <
typename F>
345 const F& f =
exact(f_);
347 for_all_lines_info(i, data_->infos_)
349 data_->infos_[i].update_tag(tag);
352 template <typename L>
353 template <typename F>
356 line_set<L>::update_types(const mln::
Function_v2b<F>& f_,
359 const F& f =
exact(f_);
361 for_all_lines_info(i, data_->infos_)
363 data_->infos_[i].update_type(type);
366 template <typename L>
376 template <
typename L>
378 const component_set<L>&
381 return data_->components_;
384 template <
typename L>
387 line_set<L>::components_()
389 return data_->components_;
392 template <
typename L>
394 const object_groups<L>&
395 line_set<L>::groups()
const
397 return data_->groups_;
400 template <
typename L>
402 const object_links<L>&
403 line_set<L>::links()
const
405 return data_->links_;
408 template <
typename L>
411 line_set<L>::force_stats_update()
413 for_all_lines_info(i, data_->infos_)
414 if (data_->infos_(i).tag() ==
line::Needs_Precise_Stats_Update)
415 data_->infos_(i).force_stats_update();
418 template <typename L>
420 const mln::util::array<scribo::line_info<L> >&
421 line_set<L>::infos_()
const
423 return data_->infos_;
426 template <
typename L>
429 line_set<L>::is_valid()
const
431 return data_ && data_->groups_.is_valid();
434 template <
typename L>
437 line_set<L>::update_line_data_(
const mln::util::array<line_info<L> >& line_data)
439 data_->infos_ = line_data;
442 template <
typename L>
445 line_set<L>::init_(
const line_set<L>&
set)
447 data_ =
new internal::line_set_data<L>(
set.infos_(),
set.groups());
450 template <
typename L>
452 operator==(
const line_set<L>& lhs,
const line_set<L>& rhs)
454 if (! (lhs.groups() == rhs.groups() && lhs.nelements() == rhs.nelements()))
459 for_all_lines(l, lhs)
460 if ( ! (lhs(l) != rhs(l)))
470 template <
typename L>
472 operator<<(std::ostream& ostr, const line_set<L>& lines)
474 ostr <<
"line_set[" << std::endl;
475 for_all_lines(i, lines)
477 ostr << "]" << std::endl;
488 template <
typename L>
490 line_set(
const object_groups<L>& groups)
492 mln_precondition(groups.is_valid());
500 # endif // ! MLN_INCLUDE_ONLY
504 #endif // ! SCRIBO_CORE_LINE_SET_HH