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 };