2#include <score/model/IdentifiedObject.hpp>
3#include <score/tools/std/IndirectContainer.hpp>
5#include <ossia/detail/hash_map.hpp>
16template <
class Element,
class Model = Element,
bool Order = false>
32template <
typename Element,
typename Model>
33 requires std::is_base_of_v<IdentifiedObject<Model>, Element>
37 using model_type = Model;
38 using order_t = std::list<Element*>;
40 = ossia::hash_map<Id<Model>, std::pair<Element*, typename order_t::iterator>>;
44 using value_type = Element;
59 for(
auto elt : m_order)
65 OSSIA_INLINE
auto& ordered() INLINE_EXPORT {
return m_order; }
69 return score::make_indirect_iterator(this->m_order.begin());
73 return score::make_indirect_iterator(this->m_order.rbegin());
77 return score::make_indirect_iterator(this->m_order.cbegin());
81 return score::make_indirect_iterator(this->m_order.end());
85 return score::make_indirect_iterator(this->m_order.rend());
89 return score::make_indirect_iterator(this->m_order.cend());
92 OSSIA_INLINE std::size_t size()
const INLINE_EXPORT {
return m_map.size(); }
94 bool empty()
const INLINE_EXPORT {
return m_map.empty(); }
96 std::vector<Element*> as_vec()
const INLINE_EXPORT
98 return std::vector<Element*>(m_order.begin(), m_order.end());
113 SCORE_ASSERT(m_map.find(t->id()) == m_map.end());
114 m_order.push_back(t);
115 m_map.insert({t->id(), {t, std::prev(m_order.end())}});
118 void remove(
typename map_t::iterator it) INLINE_EXPORT
122 if(it != this->m_map.end())
124 m_order.erase(it->second.second);
128 void remove(
typename map_t::const_iterator it) INLINE_EXPORT
132 if(it != this->m_map.end())
134 m_order.erase(it->second.second);
139 void remove(
const Id<Model>&
id) INLINE_EXPORT { remove(m_map.find(
id)); }
141 void clear() INLINE_EXPORT
150 const_iterator find(
const Id<Model>&
id)
const INLINE_EXPORT
152 auto it = this->m_map.find(
id);
153 if(it != this->m_map.end())
155 return score::make_indirect_iterator(
156 (
typename order_t::const_iterator)it->second.second);
160 return score::make_indirect_iterator(this->m_order.end());
164 Element& at(
const Id<Model>&
id)
const INLINE_EXPORT
168 SCORE_ASSERT(
id.m_ptr->parent() == this->m_map.find(
id)->second.first->parent());
169 return safe_cast<Element&>(*
id.m_ptr);
171 auto item = this->m_map.find(
id);
172 SCORE_ASSERT(item != this->m_map.end());
174 id.m_ptr = item->second.first;
175 return safe_cast<Element&>(*item->second.first);
182template <
typename Element,
typename Model>
183 requires std::is_base_of_v<IdentifiedObject<Model>, Element>
187 using model_type = Model;
188 using map_t = ossia::hash_map<Id<Model>, Element*>;
191 using value_type = Element;
205 for(
const auto& elt : m_map)
213 return score::make_indirect_map_iterator(this->m_map.begin());
223 return score::make_indirect_map_iterator(this->m_map.cbegin());
227 return score::make_indirect_map_iterator(this->m_map.end());
237 return score::make_indirect_map_iterator(this->m_map.cend());
240 OSSIA_INLINE std::size_t size()
const INLINE_EXPORT {
return m_map.size(); }
242 OSSIA_INLINE
bool empty()
const INLINE_EXPORT {
return m_map.empty(); }
244 std::vector<Element*> as_vec()
const INLINE_EXPORT
246 std::vector<Element*> e;
247 e.reserve(m_map.size());
248 for(
auto& [key, val] : m_map)
258 e.reserve(m_map.size());
259 for(
auto& [key, val] : m_map)
266 void insert(value_type* t) INLINE_EXPORT
268 SCORE_ASSERT(m_map.find(t->id()) == m_map.end());
269 m_map.insert({t->id(), t});
272 void remove(
typename map_t::iterator it) INLINE_EXPORT
275 if(it != this->m_map.end())
280 void remove(
typename map_t::const_iterator it) INLINE_EXPORT
283 if(it != this->m_map.end())
289 void remove(
const Id<Model>&
id) INLINE_EXPORT { remove(m_map.find(
id)); }
291 void clear() INLINE_EXPORT
301 auto it = this->m_map.find(
id);
302 if(it != this->m_map.end())
304 return score::make_indirect_map_iterator(it);
308 return score::make_indirect_map_iterator(this->m_map.end());
312 Element& at(
const Id<Model>&
id)
const INLINE_EXPORT
316 SCORE_ASSERT(
id.m_ptr->parent() == this->m_map.find(
id)->second->parent());
317 return safe_cast<Element&>(*
id.m_ptr);
319 auto item = this->m_map.find(
id);
320 SCORE_ASSERT(item != this->m_map.end());
322 id.m_ptr = item->second;
323 return safe_cast<Element&>(*item->second);
330template <
typename Element,
typename Model>
331 requires(!std::is_base_of_v<IdentifiedObject<Model>, Element>)
335 using model_type = Model;
336 ossia::hash_map<Id<Model>, Element*> m_map;
338 std::vector<Element*> as_vec() const INLINE_EXPORT
340 std::vector<Element*> v;
341 const auto N = m_map.size();
345 v.push_back(e.second);
350 OSSIA_INLINE
auto begin() const INLINE_EXPORT
352 return score::make_indirect_map_iterator(this->m_map.begin());
354 OSSIA_INLINE
auto rbegin() const INLINE_EXPORT
356 return score::make_indirect_map_iterator(this->m_map.begin());
358 OSSIA_INLINE
auto cbegin() const INLINE_EXPORT
360 return score::make_indirect_map_iterator(this->m_map.cbegin());
362 OSSIA_INLINE
auto end() const INLINE_EXPORT
364 return score::make_indirect_map_iterator(this->m_map.end());
366 OSSIA_INLINE
auto rend() const INLINE_EXPORT
368 return score::make_indirect_map_iterator(this->m_map.end());
370 OSSIA_INLINE
auto cend() const INLINE_EXPORT
372 return score::make_indirect_map_iterator(this->m_map.cend());
375 auto find(
const Id<Model>&
id)
const INLINE_EXPORT
377 return score::make_indirect_map_iterator(this->m_map.find(
id));
380 void insert(Element* t) INLINE_EXPORT
382 SCORE_ASSERT(m_map.find(t->id()) == m_map.end());
383 m_map.insert({t->id(), t});
386 void erase(
const Id<Model>&
id) INLINE_EXPORT
388 auto it = m_map.find(
id);
389 if(it != m_map.end())
391 auto ptr = it->second;
397 void remove_all() INLINE_EXPORT
406 auto& at(
const Id<Model>&
id)
const INLINE_EXPORT
408 auto item = this->m_map.find(
id);
409 SCORE_ASSERT(item != this->m_map.end());
410 return *item->second;
void insert(value_type *t) INLINE_EXPORT
Definition IdentifiedObjectMap.hpp:111
A map to access child objects through their id.
Definition IdentifiedObjectMap.hpp:17
The id_base_t class.
Definition Identifier.hpp:59
Definition IndirectContainer.hpp:169
Definition IndirectContainer.hpp:10
Definition IndirectContainer.hpp:89