annotate foosdk/sdk/foobar2000/helpers/callback_merit.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 <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <algorithm>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/callback_merit.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // Call global callbacks in correct order
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // INTENDED FOR CORE USE ONLY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // Not aware of dynamically registered callbacks, if there are such for the same event type
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 // Usage: for_each_callback_by_merit< metadb_io_edit_callback > ( [] ( metadb_io_edit_callback::ptr ) { ...} );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 template<typename class_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void for_each_callback_by_merit(std::function<void(service_ptr_t<class_t>)> f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 struct rec_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class_t* obj; // non-autoptr INTENDED, avoid destruction order bugs on shutdown
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 fb2k::callback_merit_t merit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 auto generator = [] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 std::vector<rec_t> ret; ret.reserve(64);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 for (auto ptr : class_t::enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 rec_t r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 r.merit = fb2k::callback_merit_of(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 r.obj = ptr.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 ret.push_back( std::move(r) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 std::sort(ret.begin(), ret.end(), [](rec_t const& e1, rec_t const& e2) { return e1.merit > e2.merit; });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 static std::vector<rec_t> cache = generator();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 for (auto& walk : cache) f(walk.obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }