annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <set>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 class metadb_handle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class metadb_handle_set {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 metadb_handle_set() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 template<typename ptr_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 bool add_item_check(ptr_t const & item) { return add_item_check_(&*item); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 template<typename ptr_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 bool remove_item(ptr_t const & item) { return remove_item_(&*item); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 bool add_item_check_(metadb_handle * p) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool rv = m_content.insert(p).second;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (rv) p->service_add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 bool remove_item_(metadb_handle * p) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 bool rv = m_content.erase(p) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (rv) p->service_release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 size_t size() const {return m_content.size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 size_t get_count() const {return m_content.size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 template<typename ptr_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 bool contains(ptr_t const & item) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 return m_content.count(&*item) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 template<typename ptr_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 bool have_item(ptr_t const & item) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return m_content.count(&*item) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void operator+=(metadb_handle::ptr const & item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 add_item_check_(item.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void operator-=(metadb_handle::ptr const & item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 remove_item_(item.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 void operator+=(metadb_handle::ptr && item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 auto p = item.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 bool added = m_content.insert(p).second;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 if (!added) p->service_release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 for (auto p : m_content) p->service_release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 m_content.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void remove_all() { clear();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 template<typename callback_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void enumerate(callback_t & cb) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for (auto iter : m_content) cb(iter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 typedef std::set<metadb_handle*> impl_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 typedef impl_t::const_iterator const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 const_iterator begin() const { return m_content.begin(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 const_iterator end() const { return m_content.end(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 metadb_handle_list to_list() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 metadb_handle_list ret; ret.prealloc(m_content.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 for (auto h : m_content) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 ret.add_item(h);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 metadb_handle_set(const metadb_handle_set& src) { _copy(src); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 void operator=(const metadb_handle_set& src) { _copy(src); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 metadb_handle_set(metadb_handle_set&& src) noexcept { _move(src); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void operator=(metadb_handle_set&& src) noexcept { _move(src); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 void _copy(const metadb_handle_set& src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 m_content = src.m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 for (auto h : m_content) h->service_add_ref();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void _move(metadb_handle_set& src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 m_content = std::move(src.m_content); src.m_content.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 impl_t m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 };