annotate foosdk/sdk/pfc/order_helper.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 PFC_DECLARE_EXCEPTION( exception_invalid_permutation, exception_invalid_params, "Invalid permutation" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 t_size permutation_find_reverse(t_size const * order, t_size count, t_size value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! For critical sanity checks. Speed: O(n), allocates memory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 bool permutation_is_valid(t_size const * order, t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! For critical sanity checks. Speed: O(n), allocates memory.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 void permutation_validate(t_size const * order, t_size count);
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 //! Creates a permutation that moves selected items in a list box by the specified delta-offset.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void create_move_items_permutation(t_size * p_output,t_size p_count,const class bit_array & p_selection,int p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void create_move_item_permutation( size_t * p_output, size_t p_count, size_t from, size_t to );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 bool create_drop_permutation(size_t * out, size_t itemCount, pfc::bit_array const & maskSelected, size_t insertMark );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 bool is_identity(size_t const* order, size_t count);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class order_helper
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 pfc::array_t<t_size> m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 order_helper(t_size p_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 m_data.set_size(p_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 for(t_size n=0;n<p_size;n++) m_data[n]=n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
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 order_helper(const order_helper & p_order) {*this = p_order;}
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 static bool g_is_identity(const t_size * order, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 if (order[walk] != walk) return false;
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 return true;
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 template<typename t_array> static bool g_is_identity(const t_array & p_array) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 const t_size count = pfc::array_size_t(p_array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 for(t_size walk = 0; walk < count; ++walk) if (p_array[walk] != walk) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 template<typename t_int>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 static void g_fill(t_int * p_order,const t_size p_count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 t_size n; for(n=0;n<p_count;n++) p_order[n] = (t_int)n;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 template<typename t_array>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 static void g_fill(t_array & p_array) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 t_size n; const t_size max = pfc::array_size_t(p_array);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for(n=0;n<max;n++) p_array[n] = n;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 t_size get_item(t_size ptr) const {return m_data[ptr];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 t_size & operator[](t_size ptr) {return m_data[ptr];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 t_size operator[](t_size ptr) const {return m_data[ptr];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 static void g_swap(t_size * p_data,t_size ptr1,t_size ptr2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 inline void swap(t_size ptr1,t_size ptr2) {pfc::swap_t(m_data[ptr1],m_data[ptr2]);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 const t_size * get_ptr() const {return m_data.get_ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 t_size* get_ptr() { return m_data.get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! Insecure - may deadlock or crash on invalid permutation content. In theory faster than walking the permutation, but still O(n).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 static t_size g_find_reverse(const t_size * order,t_size val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 //! Insecure - may deadlock or crash on invalid permutation content. In theory faster than walking the permutation, but still O(n).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 inline t_size find_reverse(t_size val) {return g_find_reverse(m_data.get_ptr(),val);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 static void g_reverse(t_size * order,t_size base,t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 inline void reverse(t_size base,t_size count) {g_reverse(m_data.get_ptr(),base,count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_size get_count() const {return m_data.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 };