27 lines
874 B
C++
27 lines
874 B
C++
#pragma once
|
|
|
|
namespace pfc {
|
|
template<typename t_list1, typename t_list2>
|
|
static bool guess_reorder_pattern(pfc::array_t<t_size> & out, const t_list1 & from, const t_list2 & to) {
|
|
typedef typename t_list1::t_item t_item;
|
|
const t_size count = from.get_size();
|
|
if (count != to.get_size()) return false;
|
|
out.set_size(count);
|
|
for(t_size walk = 0; walk < count; ++walk) out[walk] = walk;
|
|
//required output: to[n] = from[out[n]];
|
|
typedef pfc::chain_list_v2_t<t_size> t_queue;
|
|
pfc::map_t<t_item, t_queue > content;
|
|
for(t_size walk = 0; walk < count; ++walk) {
|
|
content.find_or_add(from[walk]).add_item(walk);
|
|
}
|
|
for(t_size walk = 0; walk < count; ++walk) {
|
|
t_queue * q = content.query_ptr(to[walk]);
|
|
if (q == NULL) return false;
|
|
if (q->get_count() == 0) return false;
|
|
out[walk] = *q->first();
|
|
q->remove(q->first());
|
|
}
|
|
return true;
|
|
}
|
|
}
|