annotate foosdk/sdk/pfc/primitives_part2.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 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 template<typename t_list1, typename t_list2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 static bool guess_reorder_pattern(pfc::array_t<t_size> & out, const t_list1 & from, const t_list2 & to) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 typedef typename t_list1::t_item t_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 const t_size count = from.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 if (count != to.get_size()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 out.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 for(t_size walk = 0; walk < count; ++walk) out[walk] = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //required output: to[n] = from[out[n]];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 typedef pfc::chain_list_v2_t<t_size> t_queue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 pfc::map_t<t_item, t_queue > content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 content.find_or_add(from[walk]).add_item(walk);
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 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_queue * q = content.query_ptr(to[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if (q == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 if (q->get_count() == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 out[walk] = *q->first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 q->remove(q->first());
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 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }