27 #ifndef SCRIBO_CORE_OBJECT_LINKS_HH
28 # define SCRIBO_CORE_OBJECT_LINKS_HH
35 # include <mln/util/array.hh>
36 # include <mln/util/tracked_ptr.hh>
38 # include <scribo/core/component_set.hh>
40 # include <scribo/core/concept/serializable.hh>
48 template <
typename L>
class object_links;
61 unsigned size,
unsigned default_link_id);
111 bool is_valid()
const;
115 bool has_linking_enabled(
unsigned comp_id)
const;
119 bool is_linked(
unsigned comp_id)
const;
123 unsigned nelements()
const;
128 void update(
unsigned from_id,
unsigned to_id);
132 void clear(
unsigned id);
136 void disable_linking(
unsigned id);
139 const unsigned& operator()(
unsigned comp_id)
const;
160 template <
typename L>
162 operator<<(std::ostream& ostr, const object_links<L>& links);
165 # ifndef MLN_INCLUDE_ONLY
173 template <
typename L>
174 object_links_data<L>::object_links_data()
179 template <
typename L>
180 object_links_data<L>::object_links_data(
const component_set<L>&
components,
182 : comp_to_link_(size), components_(components)
187 template <
typename L>
188 object_links_data<L>::object_links_data(
const component_set<L>&
components,
189 unsigned size,
unsigned default_link_id)
190 : comp_to_link_(size, default_link_id), components_(components)
199 template <
typename L>
200 object_links<L>::object_links()
206 template <
typename L>
207 object_links<L>::object_links(
const component_set<L>&
components)
209 data_ =
new data_t(components, value::next(components.nelements()));
216 template <
typename L>
217 object_links<L>::object_links(
const component_set<L>& components,
218 unsigned default_link_id)
220 data_ =
new data_t(components, value::next(components.nelements()),
225 template <
typename L>
226 const component_set<L>&
229 return data_->components_;
233 template <
typename L>
235 object_links<L>::is_valid()
const
237 return data_->components_.is_valid()
238 && data_->components_.nelements() == (this->
nelements() - 1);
242 template <
typename L>
244 object_links<L>::has_linking_enabled(
unsigned comp_id)
const
246 mln_precondition(is_valid());
247 mln_precondition(comp_id < data_->comp_to_link_.nelements());
249 return data_->comp_to_link_(comp_id) != 0;
252 template <
typename L>
254 object_links<L>::is_linked(
unsigned comp_id)
const
256 mln_precondition(is_valid());
257 mln_precondition(comp_id < data_->comp_to_link_.nelements());
259 return has_linking_enabled(comp_id)
260 && data_->comp_to_link_(comp_id) != comp_id;
264 template <
typename L>
266 object_links<L>::nelements()
const
268 return data_->comp_to_link_.nelements();
272 template <
typename L>
274 object_links<L>::operator()(
unsigned comp_id)
const
276 return data_->comp_to_link_(comp_id);
279 template <
typename L>
283 data_->comp_to_link_(from_id) = to_id;
286 template <
typename L>
288 object_links<L>::clear(
unsigned id)
290 data_->comp_to_link_(
id) = id;
293 template <
typename L>
295 object_links<L>::disable_linking(
unsigned id)
297 data_->comp_to_link_(
id) = 0;
300 template <
typename L>
302 object_links<L>::comp_to_link()
const
304 return data_->comp_to_link_;
307 template <
typename L>
309 object_links<L>::init()
311 for (
unsigned i = 0; i <
nelements(); ++i)
312 if (data_->components_(i).tag() == component::Ignored)
318 template <
typename L>
323 object_links<L> output;
324 output.data_ =
new data_t();
326 *(output.data_.ptr_) = *(data_.ptr_);
331 template <
typename L>
333 operator<<(std::ostream& ostr, const object_links<L>& links)
335 ostr <<
"object_links[";
337 for_all_links(l, links)
338 ostr << l << "->" << links.comp_to_link()[l] << ", ";
346 # endif // ! MLN_INCLUDE_ONLY
352 #endif // ! SCRIBO_CORE_OBJECT_LINKS_HH