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());
168 auto item = this->m_map.find(
id);
169 SCORE_ASSERT(item != this->m_map.end());
171 id.m_ptr = item->second.first;
172 return safe_cast<Element&>(*item->second.first);
179template <
typename Element,
typename Model>
180 requires std::is_base_of_v<IdentifiedObject<Model>, Element>
184 using model_type = Model;
185 using map_t = ossia::hash_map<Id<Model>, Element*>;
188 using value_type = Element;
202 for(
const auto& elt : m_map)
210 return score::make_indirect_map_iterator(this->m_map.begin());
220 return score::make_indirect_map_iterator(this->m_map.cbegin());
224 return score::make_indirect_map_iterator(this->m_map.end());
234 return score::make_indirect_map_iterator(this->m_map.cend());
237 OSSIA_INLINE std::size_t size()
const INLINE_EXPORT {
return m_map.size(); }
239 OSSIA_INLINE
bool empty()
const INLINE_EXPORT {
return m_map.empty(); }
241 std::vector<Element*> as_vec()
const INLINE_EXPORT
243 std::vector<Element*> e;
244 e.reserve(m_map.size());
245 for(
auto& [key, val] : m_map)
255 e.reserve(m_map.size());
256 for(
auto& [key, val] : m_map)
263 void insert(value_type* t) INLINE_EXPORT
265 SCORE_ASSERT(m_map.find(t->id()) == m_map.end());
266 m_map.insert({t->id(), t});
269 void remove(
typename map_t::iterator it) INLINE_EXPORT
272 if(it != this->m_map.end())
277 void remove(
typename map_t::const_iterator it) INLINE_EXPORT
280 if(it != this->m_map.end())
286 void remove(
const Id<Model>&
id) INLINE_EXPORT { remove(m_map.find(
id)); }
288 void clear() INLINE_EXPORT
298 auto it = this->m_map.find(
id);
299 if(it != this->m_map.end())
301 return score::make_indirect_map_iterator(it);
305 return score::make_indirect_map_iterator(this->m_map.end());
313 auto item = this->m_map.find(
id);
314 SCORE_ASSERT(item != this->m_map.end());
316 id.m_ptr = item->second;
317 return safe_cast<Element&>(*item->second);
324template <
typename Element,
typename Model>
325 requires(!std::is_base_of_v<IdentifiedObject<Model>, Element>)
329 using model_type = Model;
330 ossia::hash_map<Id<Model>, Element*> m_map;
332 std::vector<Element*> as_vec() const INLINE_EXPORT
334 std::vector<Element*> v;
335 const auto N = m_map.size();
339 v.push_back(e.second);
344 OSSIA_INLINE
auto begin() const INLINE_EXPORT
346 return score::make_indirect_map_iterator(this->m_map.begin());
348 OSSIA_INLINE
auto rbegin() const INLINE_EXPORT
350 return score::make_indirect_map_iterator(this->m_map.begin());
352 OSSIA_INLINE
auto cbegin() const INLINE_EXPORT
354 return score::make_indirect_map_iterator(this->m_map.cbegin());
356 OSSIA_INLINE
auto end() const INLINE_EXPORT
358 return score::make_indirect_map_iterator(this->m_map.end());
360 OSSIA_INLINE
auto rend() const INLINE_EXPORT
362 return score::make_indirect_map_iterator(this->m_map.end());
364 OSSIA_INLINE
auto cend() const INLINE_EXPORT
366 return score::make_indirect_map_iterator(this->m_map.cend());
369 auto find(
const Id<Model>&
id)
const INLINE_EXPORT
371 return score::make_indirect_map_iterator(this->m_map.find(
id));
374 void insert(Element* t) INLINE_EXPORT
376 SCORE_ASSERT(m_map.find(t->id()) == m_map.end());
377 m_map.insert({t->id(), t});
380 void erase(
const Id<Model>&
id) INLINE_EXPORT
382 auto it = m_map.find(
id);
383 if(it != m_map.end())
385 auto ptr = it->second;
391 void remove_all() INLINE_EXPORT
400 auto& at(
const Id<Model>&
id)
const INLINE_EXPORT
402 auto item = this->m_map.find(
id);
403 SCORE_ASSERT(item != this->m_map.end());
404 return *item->second;
Element & at(const Id< Model > &id) const INLINE_EXPORT
Definition IdentifiedObjectMap.hpp:311
Element & at(const Id< Model > &id) const INLINE_EXPORT
Definition IdentifiedObjectMap.hpp:166
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