26 #ifndef SCRIBO_CORE_LINE_LINKS_HH
27 # define SCRIBO_CORE_LINE_LINKS_HH
34 # include <mln/util/array.hh>
35 # include <mln/util/tracked_ptr.hh>
37 # include <scribo/core/concept/serializable.hh>
38 # include <scribo/core/line_set.hh>
47 template <
typename L>
class line_links;
86 bool is_valid()
const;
88 unsigned nelements()
const;
104 template <
typename L>
106 operator<<(std::ostream& ostr, const line_links<L>& links);
108 template <
typename L>
113 # ifndef MLN_INCLUDE_ONLY
121 template <
typename L>
122 line_links_data<L>::line_links_data()
127 template <
typename L>
128 line_links_data<L>::line_links_data(
const line_set<L>& lines,
130 : line_to_link_(size), lines_(lines)
135 template <
typename L>
136 line_links_data<L>::line_links_data(
const line_set<L>& lines,
137 unsigned size, line_id_t
value)
138 : line_to_link_(size, value), lines_(lines)
147 template <
typename L>
148 line_links<L>::line_links()
154 template <
typename L>
155 line_links<L>::line_links(
const line_set<L>& lines)
157 data_ =
new data_t(lines, value::next(lines.nelements()));
161 template <
typename L>
162 line_links<L>::line_links(
const line_set<L>& lines,
165 data_ =
new data_t(lines, value::next(lines.nelements()),
170 template <
typename L>
172 line_links<L>::lines()
const
174 return data_->lines_;
178 template <
typename L>
180 line_links<L>::is_valid()
const
182 return data_->lines_.is_valid()
183 && data_->lines_.nelements() == (this->
nelements() - 1);
187 template <
typename L>
189 line_links<L>::nelements()
const
191 return data_->line_to_link_.nelements();
195 template <
typename L>
197 line_links<L>::operator()(line_id_t comp_id)
199 return data_->line_to_link_(comp_id);
203 template <
typename L>
205 line_links<L>::operator()(line_id_t comp_id)
const
207 return data_->line_to_link_(comp_id);
211 template <
typename L>
213 line_links<L>::line_to_link()
const
215 return data_->line_to_link_;
219 template <
typename L>
221 line_links<L>::init()
223 for (
unsigned i = 0; i <
nelements(); ++i)
224 if (!data_->lines_(i).is_valid()
225 || !data_->lines_(i).is_textline())
227 data_->line_to_link_(i) = 0;
231 data_->line_to_link_(i) = i;
235 template <
typename L>
240 line_links<L> output;
241 output.data_ =
new data_t();
243 *(output.data_.ptr_) = *(data_.ptr_);
248 template <
typename L>
250 operator<<(std::ostream& ostr, const line_links<L>& links)
252 ostr <<
"line_links[";
254 for_all_links(l, links)
255 ostr << l << "->" << links.line_to_link()[l] << ", ";
263 template <typename L>
265 operator==(const line_links<L>& lhs, const line_links<L>& rhs)
267 return lhs.lines() == rhs.lines()
268 && lhs.line_to_link() == rhs.line_to_link();
271 # endif // ! MLN_INCLUDE_ONLY
277 #endif // ! SCRIBO_CORE_LINE_LINKS_HH