acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
_compare_swap.h
1// Created by camilo on 2023-01-20 22:37 <3ThomasBorregaardSorensen!!
2// 2023-01-20 22:37 - Mummi, Lucinho, Bilbo, Blue, Carol e Zibia contribution through ca2 HQ!!
3// 2023-01-20 22:37 - lowluds, shegotmad, mrsteinbergplease and octaelliptical contribution through Twitch.TV!!
4#pragma once
5
6
7
8
9namespace compare_swap
10{
11
12
13 template < typename F1, typename F2, typename A1, typename A2 >
14 void quick_sort_compare_swap(
15 ::collection::index iSize,
16 //const ::array < ::function < ::std::strong_ordering(void *, iptr, iptr) > > & comparefunctiona,
17 const F1 & comparefunctiona,
18 //const ::array < ::function < void(void *, iptr, iptr) > > & swapfunctiona,
19 const F2 & swapfunctiona,
20 //const void_ptra & comparearga,
21 const A1 & comparearga,
22 //const void_ptra & swaparga)
23 const A2 & swaparga)
24 {
25
26 index_array stackLowerBound;
27 index_array stackUpperBound;
28 ::collection::index iLowerBound;
29 ::collection::index iUpperBound;
30 ::collection::index iLPos, iUPos, iMPos;
31
32 ::i32 iCmp;
33 ::std::strong_ordering iCompare(::std::strong_ordering::equal);
34
35 if (iSize >= 2)
36 {
37
38 stackLowerBound.push(0);
39 stackUpperBound.push(iSize - 1);
40
41 while (true)
42 {
43
44 iLowerBound = stackLowerBound.pop();
45 iUpperBound = stackUpperBound.pop();
46 iLPos = iLowerBound;
47 iMPos = iLowerBound;
48 iUPos = iUpperBound;
49 while (true)
50 {
51 while (true)
52 {
53 if (iMPos == iUPos)
54 break;
55 iCmp = 0;
56 for (::i32 i = 0; i < comparefunctiona.get_size(); i++)
57 {
58 auto iCompare = comparefunctiona[i](comparearga[i], iMPos, iUPos);
59 if (iCompare > 0)
60 {
61 iCmp = 1;
62 break;
63 }
64 else if (iCompare < 0)
65 {
66 iCmp = -1;
67 break;
68 }
69 }
70 if (iCmp <= 0)
71 iUPos--;
72 else
73 {
74 for (::i32 i = 0; i < swapfunctiona.get_size(); i++)
75 {
76 swapfunctiona[i](swaparga[i], iMPos, iUPos);
77 }
78 break;
79 }
80 }
81 if (iMPos == iUPos)
82 break;
83 iMPos = iUPos;
84 while (true)
85 {
86 if (iMPos == iLPos)
87 break;
88 iCmp = 0;
89 for (::i32 i = 0; i < comparefunctiona.get_size(); i++)
90 {
91 iCompare = comparefunctiona[i](comparearga[i], iLPos, iMPos);
92 if (iCompare > 0)
93 {
94 iCmp = 1;
95 break;
96 }
97 else if (iCompare < 0)
98 {
99 iCmp = -1;
100 break;
101 }
102 }
103 if (iCmp <= 0)
104 iLPos++;
105 else
106 {
107 for (::i32 i = 0; i < swapfunctiona.get_size(); i++)
108 {
109 swapfunctiona[i](swaparga[i], iLPos, iMPos);
110 }
111 break;
112 }
113 }
114 if (iMPos == iLPos)
115 break;
116 iMPos = iLPos;
117 }
118 if (iLowerBound < iMPos - 1)
119 {
120 stackLowerBound.push(iLowerBound);
121 stackUpperBound.push(iMPos - 1);
122 }
123 if (iMPos + 1 < iUpperBound)
124 {
125 stackLowerBound.push(iMPos + 1);
126 stackUpperBound.push(iUpperBound);
127 }
128 if (stackLowerBound.get_size() == 0)
129 break;
130 }
131
132 }
133
134 }
135
136
137 //typedef void (*ARG_SWAP_FUNCTION)(void * pVoidSwapArg, iptr, iptr);
138
139 //typedef ::std::strong_ordering(*ARG_COMPARE_FUNCTION)(void * pVoidCompareArg, iptr, iptr);
140
141
142 //void CLASS_DECL_ACME quick_sort(
143 // iptr iSize,
144 // const ::array < ARG_COMPARE_FUNCTION, ARG_COMPARE_FUNCTION > & comparefna,
145 // const ::array < ARG_SWAP_FUNCTION, ARG_SWAP_FUNCTION > & swapfna,
146 // const void_ptra & comparearga,
147 // const void_ptra & swaparga);
148
149
150 // void CLASS_DECL_ACME quick_sort(
151 // iptr iSize,
152 // const ::array < ::function < ::std::strong_ordering(void *, iptr, iptr) > > & comparefna,
153 // const ::array < ::function < void(void *, iptr, iptr) > > & swapfna,
154 // const void_ptra & comparearga,
155 // const void_ptra & swaparga);
156
157 // void CLASS_DECL_ACME quick_sort(
158 // iptr iSize,
159 // const ::array < ::function < ::std::strong_ordering(void *, iptr, iptr) > > & comparefna,
160 // const ::array < ::function < void(void *, iptr, iptr) > > & swapfna,
161 // const void_ptra & comparearga,
162 // const void_ptra & swaparga);
163
164
165} // namespace compare_swap
166
167
168