latest SDK
This commit is contained in:
71
foobar2000/helpers/metadb_handle_set.h
Normal file
71
foobar2000/helpers/metadb_handle_set.h
Normal file
@@ -0,0 +1,71 @@
|
||||
#pragma once
|
||||
#include <set>
|
||||
class metadb_handle;
|
||||
|
||||
// Roughly same as pfc::avltree_t<metadb_handle_ptr> or std::set<metadb_handle_ptr>, but optimized for use with large amounts of items
|
||||
class metadb_handle_set {
|
||||
public:
|
||||
metadb_handle_set() {}
|
||||
template<typename ptr_t>
|
||||
bool add_item_check(ptr_t const & item) { return add_item_check_(&*item); }
|
||||
template<typename ptr_t>
|
||||
bool remove_item(ptr_t const & item) { return remove_item_(&*item); }
|
||||
|
||||
bool add_item_check_(metadb_handle * p) {
|
||||
bool rv = m_content.insert(p).second;
|
||||
if (rv) p->service_add_ref();
|
||||
return rv;
|
||||
}
|
||||
bool remove_item_(metadb_handle * p) {
|
||||
bool rv = m_content.erase(p) != 0;
|
||||
if (rv) p->service_release();
|
||||
return rv;
|
||||
}
|
||||
|
||||
size_t get_count() const {
|
||||
return m_content.size();
|
||||
}
|
||||
template<typename ptr_t>
|
||||
bool contains(ptr_t const & item) const {
|
||||
return m_content.count(&*item) != 0;
|
||||
}
|
||||
template<typename ptr_t>
|
||||
bool have_item(ptr_t const & item) const {
|
||||
return m_content.count(&*item) != 0;
|
||||
}
|
||||
void operator+=(metadb_handle::ptr const & item) {
|
||||
add_item_check_(item.get_ptr());
|
||||
}
|
||||
void operator-=(metadb_handle::ptr const & item) {
|
||||
remove_item_(item.get_ptr());
|
||||
}
|
||||
void operator+=(metadb_handle::ptr && item) {
|
||||
auto p = item.detach();
|
||||
bool added = m_content.insert(p).second;
|
||||
if (!added) p->service_release();
|
||||
}
|
||||
void remove_all() {
|
||||
for (auto iter = m_content.begin(); iter != m_content.end(); ++iter) {
|
||||
metadb_handle * p = (*iter);
|
||||
p->service_release();
|
||||
}
|
||||
m_content.clear();
|
||||
}
|
||||
template<typename callback_t>
|
||||
void enumerate(callback_t & cb) const {
|
||||
for (auto iter = m_content.begin(); iter != m_content.end(); ++iter) {
|
||||
cb(*iter);
|
||||
}
|
||||
}
|
||||
typedef std::set<metadb_handle*> impl_t;
|
||||
typedef impl_t::const_iterator const_iterator;
|
||||
const_iterator begin() const { return m_content.begin(); }
|
||||
const_iterator end() const { return m_content.end(); }
|
||||
private:
|
||||
|
||||
std::set<metadb_handle*> m_content;
|
||||
|
||||
private:
|
||||
metadb_handle_set(const metadb_handle_set &) = delete;
|
||||
void operator=(const metadb_handle_set&) = delete;
|
||||
};
|
||||
Reference in New Issue
Block a user