annotate foosdk/sdk/foobar2000/SDK/metadb_handle_list.cpp @ 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 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "foosort.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "threadPool.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "foosortstring.h"
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 "titleformat.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "library_manager.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "genrand.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 struct custom_sort_data_multi {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static constexpr unsigned numLocal = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void setup(size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 if (count > numLocal) texts2 = std::make_unique< fb2k::sortString_t[] >( count - numLocal );
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 fb2k::sortString_t& operator[] (size_t which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 return which < numLocal ? texts1[which] : texts2[which - numLocal];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 const fb2k::sortString_t& operator[] (size_t which) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 return which < numLocal ? texts1[which] : texts2[which - numLocal];
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 fb2k::sortString_t texts1[numLocal];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 std::unique_ptr< fb2k::sortString_t[] > texts2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 size_t index;
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 struct custom_sort_data {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 fb2k::sortString_t text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 size_t index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 template<int direction>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 static int custom_sort_compare(const custom_sort_data& elem1, const custom_sort_data& elem2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 int ret = direction * fb2k::sortStringCompare(elem1.text, elem2.text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if (ret == 0) ret = pfc::sgn_t((t_ssize)elem1.index - (t_ssize)elem2.index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void metadb_handle_list_helper::sort_by_format(metadb_handle_list_ref p_list,const char * spec,titleformat_hook * p_hook)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 service_ptr_t<titleformat_object> script;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (titleformat_compiler::get()->compile(script,spec))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 sort_by_format(p_list,script,p_hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
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 void metadb_handle_list_helper::sort_by_format_get_order(metadb_handle_list_cref p_list,t_size* order,const char * spec,titleformat_hook * p_hook)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 service_ptr_t<titleformat_object> script;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (titleformat_compiler::get()->compile(script,spec))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 sort_by_format_get_order(p_list,order,script,p_hook);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void metadb_handle_list_helper::sort_by_format(metadb_handle_list_ref p_list,const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook, int direction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 const t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 pfc::array_t<t_size> order; order.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 sort_by_format_get_order(p_list,order.get_ptr(),p_script,p_hook,direction);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 p_list.reorder(order.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 class tfhook_sort : public titleformat_hook {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 tfhook_sort() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_API->seed();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 bool process_field(titleformat_text_out *,const char *,t_size,bool &) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool process_function(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,titleformat_hook_function_params * p_params,bool & p_found_flag) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if (stricmp_utf8_ex(p_name, p_name_length, "rand", SIZE_MAX) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_size param_count = p_params->get_param_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 t_uint32 val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (param_count == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 t_uint32 mod = (t_uint32)p_params->get_param_uint(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (mod > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 val = m_API->genrand(mod);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 val = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 val = m_API->genrand(0xFFFFFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 p_out->write_int(titleformat_inputtypes::unknown, val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 p_found_flag = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 genrand_service::ptr m_API = genrand_service::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 void metadb_handle_list_helper::sort_by_format_get_order(metadb_handle_list_cref p_list,t_size* order,const service_ptr_t<titleformat_object> & p_script,titleformat_hook * p_hook,int p_direction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 sort_by_format_get_order_v2(p_list, order, p_script, p_hook, p_direction, fb2k::noAbort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void metadb_handle_list_helper::sort_by_relative_path(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 const t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 pfc::array_t<t_size> order; order.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 sort_by_relative_path_get_order(p_list,order.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 p_list.reorder(order.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 void metadb_handle_list_helper::sort_by_relative_path_get_order(metadb_handle_list_cref p_list,t_size* order)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 const t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 std::vector<custom_sort_data> data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 data.resize(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 auto api = library_manager::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 temp.prealloc(512);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 for(n=0;n<count;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 metadb_handle_ptr item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 p_list.get_item_ex(item,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (!api->get_relative_path(item,temp)) temp = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 data[n].index = n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 data[n].text = fb2k::makeSortString(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //data[n].subsong = item->get_subsong_index();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 pfc::sort_t(data,custom_sort_compare<1>,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //qsort(data.get_ptr(),count,sizeof(custom_sort_data),(int (__cdecl *)(const void *elem1, const void *elem2 ))custom_sort_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 for(n=0;n<count;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 order[n]=data[n].index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 void metadb_handle_list_helper::remove_duplicates(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (count>0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 pfc::bit_array_bittable mask(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 pfc::array_t<t_size> order; order.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 order_helper::g_fill(order);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 p_list.sort_get_permutation_t(pfc::compare_t<metadb_handle_ptr,metadb_handle_ptr>,order.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 for(n=0;n<count-1;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (p_list.get_item(order[n])==p_list.get_item(order[n+1]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 mask.set(order[n+1],true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 if (found) p_list.remove_mask(mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 void metadb_handle_list_helper::sort_by_pointer_remove_duplicates(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 const t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 if (count>0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 sort_by_pointer(p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 bool b_found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 for(size_t n=0;n<count-1;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 if (p_list.get_item(n)==p_list.get_item(n+1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 b_found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 if (b_found)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 pfc::bit_array_bittable mask(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 for(size_t n=0;n<count-1;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 if (p_list.get_item(n)==p_list.get_item(n+1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 mask.set(n+1,true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 p_list.remove_mask(mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void metadb_handle_list_helper::sort_by_path_quick(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 p_list.sort_t(metadb::path_compare_metadb_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void metadb_handle_list_helper::sort_by_pointer(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 p_list.sort();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 t_size metadb_handle_list_helper::bsearch_by_pointer(metadb_handle_list_cref p_list,const metadb_handle_ptr & val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 t_size blah;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (p_list.bsearch_t(pfc::compare_t<metadb_handle_ptr,metadb_handle_ptr>,val,blah)) return blah;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 else return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 void metadb_handle_list_helper::sorted_by_pointer_extract_difference(metadb_handle_list const & p_list_1,metadb_handle_list const & p_list_2,metadb_handle_list & p_list_1_specific,metadb_handle_list & p_list_2_specific)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 t_size found_1, found_2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 const t_size count_1 = p_list_1.get_count(), count_2 = p_list_2.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 t_size ptr_1, ptr_2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 found_1 = found_2 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 ptr_1 = ptr_2 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 while(ptr_1 < count_1 || ptr_2 < count_2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 while(ptr_1 < count_1 && (ptr_2 == count_2 || p_list_1[ptr_1] < p_list_2[ptr_2]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 found_1++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 t_size ptr_1_new = ptr_1 + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 while(ptr_1_new < count_1 && p_list_1[ptr_1_new] == p_list_1[ptr_1]) ptr_1_new++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 ptr_1 = ptr_1_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 while(ptr_2 < count_2 && (ptr_1 == count_1 || p_list_2[ptr_2] < p_list_1[ptr_1]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 found_2++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 t_size ptr_2_new = ptr_2 + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 while(ptr_2_new < count_2 && p_list_2[ptr_2_new] == p_list_2[ptr_2]) ptr_2_new++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 ptr_2 = ptr_2_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 while(ptr_1 < count_1 && ptr_2 < count_2 && p_list_1[ptr_1] == p_list_2[ptr_2]) {ptr_1++; ptr_2++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 p_list_1_specific.set_count(found_1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 p_list_2_specific.set_count(found_2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if (found_1 > 0 || found_2 > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 found_1 = found_2 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 ptr_1 = ptr_2 = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 while(ptr_1 < count_1 || ptr_2 < count_2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 while(ptr_1 < count_1 && (ptr_2 == count_2 || p_list_1[ptr_1] < p_list_2[ptr_2]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 p_list_1_specific[found_1++] = p_list_1[ptr_1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 t_size ptr_1_new = ptr_1 + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 while(ptr_1_new < count_1 && p_list_1[ptr_1_new] == p_list_1[ptr_1]) ptr_1_new++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 ptr_1 = ptr_1_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 while(ptr_2 < count_2 && (ptr_1 == count_1 || p_list_2[ptr_2] < p_list_1[ptr_1]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 p_list_2_specific[found_2++] = p_list_2[ptr_2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 t_size ptr_2_new = ptr_2 + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 while(ptr_2_new < count_2 && p_list_2[ptr_2_new] == p_list_2[ptr_2]) ptr_2_new++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 ptr_2 = ptr_2_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 while(ptr_1 < count_1 && ptr_2 < count_2 && p_list_1[ptr_1] == p_list_2[ptr_2]) {ptr_1++; ptr_2++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 double metadb_handle_list_helper::calc_total_duration_v2(metadb_handle_list_cref p_list, unsigned maxThreads, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 const size_t count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 size_t numThreads = pfc::getOptimalWorkerThreadCountEx( pfc::min_t<size_t>(maxThreads, count / 2000 ));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (numThreads == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 double ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 for (size_t n = 0; n < count; n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 double temp = p_list.get_item(n)->get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 if (temp > 0) ret += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 pfc::array_t<double> sums; sums.resize(numThreads); sums.fill_null();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 pfc::refcounter walk = 0, walkSums = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 auto worker = [&] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 double ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 size_t idx = walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 if (idx >= count || aborter.is_set()) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 double temp = p_list.get_item(idx)->get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 if (temp > 0) ret += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 sums[walkSums++] = ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 fb2k::cpuThreadPool::runMultiHelper(worker, numThreads);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 aborter.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 double ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 for (size_t walk = 0; walk < numThreads; ++walk) ret += sums[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 pfc::string8 metadb_handle_list_helper::format_total_size(metadb_handle_list_cref p_list) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 bool unknown = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 t_filesize val = metadb_handle_list_helper::calc_total_size_ex(p_list,unknown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 if (unknown) temp << "> ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 temp << pfc::format_file_size_short(val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 double metadb_handle_list_helper::calc_total_duration(metadb_handle_list_cref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 double ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 for (auto handle : p_list) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 double temp = handle->get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 if (temp > 0) ret += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 void metadb_handle_list_helper::sort_by_path(metadb_handle_list_ref p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 sort_by_format(p_list,"%path_sort%",NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 void metadb_handle_list_helper::sort_by_format_v2(metadb_handle_list_ref p_list, const service_ptr_t<titleformat_object> & script, titleformat_hook * hook, int direction, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 pfc::array_t<size_t> order; order.set_size( p_list.get_count() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 sort_by_format_get_order_v2( p_list, order.get_ptr(), script, hook, direction, aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 p_list.reorder( order.get_ptr() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 void metadb_handle_list_helper::sort_by_format_get_order_v2(metadb_handle_list_cref p_list, size_t * order, const service_ptr_t<titleformat_object> & p_script, titleformat_hook * p_hook, int p_direction, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 sorter_t s = { p_script, p_direction, p_hook };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 size_t total = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 for (size_t walk = 0; walk < total; ++walk) order[walk] = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 sort_by_format_get_order_v3(p_list, order, &s, 1, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 void metadb_handle_list_helper::sort_by_format_get_order_v3(metadb_handle_list_cref p_list, size_t* order,sorter_t const* sorters, size_t nSorters, abort_callback& aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 // pfc::hires_timer timer; timer.start();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 typedef custom_sort_data_multi data_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 const t_size count = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 if (count == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 PFC_ASSERT(pfc::permutation_is_valid(order, count));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 auto data = std::make_unique< data_t[] >(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 #if FOOBAR2000_TARGET_VERSION >= 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 bool need_info = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 for (size_t iSorter = 0; iSorter < nSorters; ++iSorter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 auto& s = sorters[iSorter];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 PFC_ASSERT(s.direction == -1 || s.direction == 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 if (s.obj->requires_metadb_info_()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 need_info = true; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if (need_info) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 // FB2K_console_formatter() << "sorting with queryMultiParallelEx_<>";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 struct qmpc_context {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 qmpc_context() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 temp.prealloc(512);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 tfhook_sort myHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 metadb_v2::get()->queryMultiParallelEx_< qmpc_context >(p_list, [&](size_t idx, metadb_v2::rec_t const& rec, qmpc_context& ctx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 aborter.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 auto& out = data[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 out.setup(nSorters);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 out.index = order[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 auto h = p_list[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 for (size_t iSorter = 0; iSorter < nSorters; ++iSorter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 auto& s = sorters[iSorter];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 if (s.hook) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 titleformat_hook_impl_splitter hookSplitter(&ctx.myHook, s.hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 h->formatTitle_v2_(rec, &hookSplitter, ctx.temp, s.obj, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 h->formatTitle_v2_(rec, &ctx.myHook, ctx.temp, s.obj, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 out[iSorter] = fb2k::makeSortString(ctx.temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 // FB2K_console_formatter() << "sorting with blank metadb info";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 auto api = fb2k::cpuThreadPool::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 pfc::counter walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 api->runMulti_([&] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 const metadb_v2_rec_t rec = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 tfhook_sort myHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 aborter.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 size_t idx = walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 if (idx >= count) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 auto& out = data[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 out.setup(nSorters);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 out.index = order[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 for (size_t iSorter = 0; iSorter < nSorters; ++iSorter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 auto& s = sorters[iSorter];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 if (s.hook) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 titleformat_hook_impl_splitter hookSplitter(&myHook, s.hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 p_list[idx]->formatTitle_v2_(rec, &hookSplitter, temp, s.obj, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 p_list[idx]->formatTitle_v2_(rec, &myHook, temp, s.obj, nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 out[iSorter] = fb2k::makeSortString(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 }, api->numRunsSanity((count + 1999) / 2000));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 pfc::counter counter(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 auto work = [&] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 tfhook_sort myHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 pfc::string8_fastalloc temp; temp.prealloc(512);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 for (;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 const t_size index = (counter)++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 if (index >= count || aborter.is_set()) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 auto& out = data[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 out.setup(nSorters);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 out.index = order[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 for (size_t iSorter = 0; iSorter < nSorters; ++iSorter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 auto& s = sorters[iSorter];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 if (s.hook) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 titleformat_hook_impl_splitter hookSplitter(&myHook, s.hook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 p_list[index]->format_title(&hookSplitter, temp, s.obj, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 p_list[index]->format_title(&myHook, temp, s.obj, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 out[iSorter] = fb2k::makeSortString(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 size_t nThreads = pfc::getOptimalWorkerThreadCountEx(count / 128);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 if (nThreads == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 work();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 fb2k::cpuThreadPool::runMultiHelper(work, nThreads);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 aborter.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 // console::formatter() << "metadb_handle sort: prepared in " << pfc::format_time_ex(timer.query(),6);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 auto compare = [&](data_t const& elem1, data_t const& elem2) -> int {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 for (size_t iSorter = 0; iSorter < nSorters; ++iSorter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 int v = fb2k::sortStringCompare(elem1[iSorter], elem2[iSorter]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 if (v) return v * sorters[iSorter].direction;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 return pfc::sgn_t((t_ssize)elem1.index - (t_ssize)elem2.index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 typedef decltype(data) container_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 typedef decltype(compare) compare_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 pfc::sort_callback_impl_simple_wrap_t<container_t, compare_t> cb(data, compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 size_t concurrency = pfc::getOptimalWorkerThreadCountEx(count / 4096);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 fb2k::sort(cb, count, concurrency, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 //qsort(data.get_ptr(),count,sizeof(custom_sort_data),p_direction > 0 ? _custom_sort_compare<1> : _custom_sort_compare<-1>);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 // console::formatter() << "metadb_handle sort: sorted in " << pfc::format_time_ex(timer.query(),6);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 for (t_size n = 0; n < count; n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 order[n] = data[n].index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 // FB2K_console_formatter() << "metadb_handle sort: finished in " << pfc::format_time_ex(timer.query(),6);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 t_filesize metadb_handle_list_helper::calc_total_size(metadb_handle_list_cref p_list, bool skipUnknown) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 pfc::avltree_t< const char*, metadb::path_comparator > beenHere;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 // metadb_handle_list list(p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 // list.sort_t(metadb::path_compare_metadb_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 t_filesize ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 t_size n, m = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 bool isNew;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 metadb_handle_ptr h; p_list.get_item_ex(h, n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 beenHere.add_ex( h->get_path(), isNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 if (isNew) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 t_filesize t = h->get_filesize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 if (t == filesize_invalid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 if (!skipUnknown) return filesize_invalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 ret += t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 t_filesize metadb_handle_list_helper::calc_total_size_ex(metadb_handle_list_cref p_list, bool & foundUnknown) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 foundUnknown = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 metadb_handle_list list(p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 list.sort_t(metadb::path_compare_metadb_handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 t_filesize ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 t_size n, m = list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 if (n==0 || metadb::path_compare(list[n-1]->get_path(),list[n]->get_path())) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 t_filesize t = list[n]->get_filesize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 if (t == filesize_invalid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 foundUnknown = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 ret += t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 bool metadb_handle_list_helper::extract_folder_path(metadb_handle_list_cref list, pfc::string_base & folderOut) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 const t_size total = list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 if (total == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 pfc::string_formatter temp, folder;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 folder = list[0]->get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 folder.truncate_to_parent_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 for(size_t walk = 1; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 temp = list[walk]->get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 temp.truncate_to_parent_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 if (metadb::path_compare(folder, temp) != 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 folderOut = folder;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 bool metadb_handle_list_helper::extract_single_path(metadb_handle_list_cref list, const char * &pathOut) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 const t_size total = list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 if (total == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 const char * path = list[0]->get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 for(t_size walk = 1; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 if (metadb::path_compare(path, list[walk]->get_path()) != 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 pathOut = path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 }