Mercurial > foo_out_sdl
comparison foosdk/sdk/foobar2000/helpers/metadb_handle_set.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 #include <set> | |
| 3 class metadb_handle; | |
| 4 | |
| 5 // Roughly same as pfc::avltree_t<metadb_handle_ptr> or std::set<metadb_handle_ptr>, but optimized for use with large amounts of items | |
| 6 class metadb_handle_set { | |
| 7 public: | |
| 8 metadb_handle_set() {} | |
| 9 template<typename ptr_t> | |
| 10 bool add_item_check(ptr_t const & item) { return add_item_check_(&*item); } | |
| 11 template<typename ptr_t> | |
| 12 bool remove_item(ptr_t const & item) { return remove_item_(&*item); } | |
| 13 | |
| 14 bool add_item_check_(metadb_handle * p) { | |
| 15 bool rv = m_content.insert(p).second; | |
| 16 if (rv) p->service_add_ref(); | |
| 17 return rv; | |
| 18 } | |
| 19 bool remove_item_(metadb_handle * p) { | |
| 20 bool rv = m_content.erase(p) != 0; | |
| 21 if (rv) p->service_release(); | |
| 22 return rv; | |
| 23 } | |
| 24 size_t size() const {return m_content.size();} | |
| 25 size_t get_count() const {return m_content.size(); } | |
| 26 template<typename ptr_t> | |
| 27 bool contains(ptr_t const & item) const { | |
| 28 return m_content.count(&*item) != 0; | |
| 29 } | |
| 30 template<typename ptr_t> | |
| 31 bool have_item(ptr_t const & item) const { | |
| 32 return m_content.count(&*item) != 0; | |
| 33 } | |
| 34 void operator+=(metadb_handle::ptr const & item) { | |
| 35 add_item_check_(item.get_ptr()); | |
| 36 } | |
| 37 void operator-=(metadb_handle::ptr const & item) { | |
| 38 remove_item_(item.get_ptr()); | |
| 39 } | |
| 40 void operator+=(metadb_handle::ptr && item) { | |
| 41 auto p = item.detach(); | |
| 42 bool added = m_content.insert(p).second; | |
| 43 if (!added) p->service_release(); | |
| 44 } | |
| 45 void clear() { | |
| 46 for (auto p : m_content) p->service_release(); | |
| 47 m_content.clear(); | |
| 48 } | |
| 49 void remove_all() { clear();} | |
| 50 template<typename callback_t> | |
| 51 void enumerate(callback_t & cb) const { | |
| 52 for (auto iter : m_content) cb(iter); | |
| 53 } | |
| 54 typedef std::set<metadb_handle*> impl_t; | |
| 55 typedef impl_t::const_iterator const_iterator; | |
| 56 const_iterator begin() const { return m_content.begin(); } | |
| 57 const_iterator end() const { return m_content.end(); } | |
| 58 | |
| 59 metadb_handle_list to_list() const { | |
| 60 metadb_handle_list ret; ret.prealloc(m_content.size()); | |
| 61 for (auto h : m_content) { | |
| 62 ret.add_item(h); | |
| 63 } | |
| 64 return ret; | |
| 65 } | |
| 66 metadb_handle_set(const metadb_handle_set& src) { _copy(src); } | |
| 67 void operator=(const metadb_handle_set& src) { _copy(src); } | |
| 68 | |
| 69 metadb_handle_set(metadb_handle_set&& src) noexcept { _move(src); } | |
| 70 void operator=(metadb_handle_set&& src) noexcept { _move(src); } | |
| 71 private: | |
| 72 void _copy(const metadb_handle_set& src) { | |
| 73 m_content = src.m_content; | |
| 74 for (auto h : m_content) h->service_add_ref(); | |
| 75 } | |
| 76 void _move(metadb_handle_set& src) { | |
| 77 m_content = std::move(src.m_content); src.m_content.clear(); | |
| 78 } | |
| 79 | |
| 80 impl_t m_content; | |
| 81 }; |
