annotate foosdk/sdk/foobar2000/helpers/metadb_io_callback_v2_data.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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <mutex>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <SDK/metadb_callbacks.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class metadb_io_callback_v2_data_impl : public metadb_io_callback_v2_data {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 metadb_handle_list_cref m_items;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 pfc::array_t< metadb_v2_rec_t> m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 std::once_flag m_once;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 metadb_io_callback_v2_data_impl(metadb_handle_list_cref items) : m_items(items) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 metadb_v2_rec_t get(size_t idxInList) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 // Late init, don't hammer metadb if nobody cares
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 // Maybe this should be offthread somehow?? Kick off early, stall till done once asked?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 std::call_once(m_once, [&] { m_data = metadb_v2::get()->queryMultiSimple(m_items); });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 PFC_ASSERT(m_data.size() == m_items.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 PFC_ASSERT(idxInList < m_data.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return m_data[idxInList];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 };
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 class metadb_io_callback_v2_data_wrap : public metadb_io_callback_v2_data {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 metadb_io_callback_v2_data_wrap(metadb_io_callback_v2_data& chain) : m_chain(chain) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 metadb_io_callback_v2_data& m_chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 std::vector<size_t> m_mapping;
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 metadb_v2_rec_t get(size_t idxInList) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 PFC_ASSERT(idxInList < m_mapping.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return m_chain[m_mapping[idxInList]];
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 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class metadb_io_callback_v2_data_mirror : public metadb_io_callback_v2_data {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 metadb_v2_rec_t get(size_t idxInList) override {return m_data[idxInList];}
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 metadb_io_callback_v2_data_mirror() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 metadb_io_callback_v2_data_mirror(metadb_io_callback_v2_data& source, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 init(source, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void init(metadb_io_callback_v2_data& source, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 m_data.set_size_discard(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 for (size_t w = 0; w < size; ++w) m_data[w] = source[w];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 pfc::array_t< metadb_v2_rec_t> m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 };