@@ -55,22 +55,24 @@ static RETURN_TYPE FUNCNAME##_cmp(ARGS, bool (*cmp)(T, T)) {
55
55
56
56
%enddef
57
57
58
- /* *****************************
58
+ /* -------------------------------------------------------------------------
59
59
* Types
60
- ***************************** */
60
+ * ------------------------------------------------------------------------- */
61
61
62
- // >>> Index integer type
62
+ // Alias the native C integer to an "indexing" integer returned by algorithm
63
+ // functions.
63
64
%inline %{
64
65
typedef int index_int;
65
66
%}
66
67
%insert(" fdecl" ) %{integer, parameter, public :: INDEX_INT = C_INT
67
68
%}
68
69
70
+ // Give it a particularly named type in the Fortran proxy code.
69
71
%apply int { index_int };
70
72
%typemap(ftype, in={integer (INDEX_INT), intent (in)}) index_int
71
- %{integer (INDEX_INT)%}
73
+ %{integer (INDEX_INT)%}
72
74
73
- // >>> Array types
75
+ // Apply array-to-C translation for numeric values
74
76
%apply (SWIGTYPE *DATA, size_t SIZE) { (index_int *IDX, size_t IDXSIZE) };
75
77
76
78
%apply (const SWIGTYPE *DATA, size_t SIZE) {
@@ -82,22 +84,22 @@ typedef int index_int;
82
84
(const double *DATA2, size_t DATASIZE2) };
83
85
84
86
85
- // >>> Function pointer types
87
+ // Make function pointers available as generic types
86
88
%typemap(fin) bool (*)(SWIGTYPE, SWIGTYPE)
87
89
" $1 = c_funloc($input)"
88
90
%typemap(findecl, match=" fin" ) bool (*)(SWIGTYPE, SWIGTYPE) " "
89
91
%typemap(fout) bool (*)(CTYPE, CTYPE)
90
92
" call c_f_procpointer($1, $result)"
91
93
%typemap(foutdecl, match=" fout" ) bool (*)(SWIGTYPE, SWIGTYPE) " "
92
94
93
- %flc_cmp_funptr(int32_t , integer(C_INT32_T))
94
- %flc_cmp_funptr(int64_t , integer(C_INT64_T))
95
- %flc_cmp_funptr(double , real(C_DOUBLE))
96
- %flc_cmp_funptr(index_int, integer(INDEX_INT))
95
+ %flc_cmp_funptr(int32_t , integer(C_INT32_T))
96
+ %flc_cmp_funptr(int64_t , integer(C_INT64_T))
97
+ %flc_cmp_funptr(double , real(C_DOUBLE))
98
+ %flc_cmp_funptr(index_int, integer(INDEX_INT))
97
99
98
- /* *****************************
99
- * Sorting
100
- ***************************** */
100
+ /* -------------------------------------------------------------------------
101
+ * Sorting routines
102
+ * ------------------------------------------------------------------------- */
101
103
102
104
%{
103
105
template <class T , class Compare >
@@ -130,21 +132,25 @@ static void argsort_impl(const T *data, size_t size,
130
132
131
133
%}
132
134
133
- %flc_cmp_algorithm(void , sort, %arg(T *DATA, size_t DATASIZE),
135
+ %flc_cmp_algorithm(void , sort,
136
+ %arg(T *DATA, size_t DATASIZE),
134
137
%arg(DATA, DATASIZE))
135
- %flc_cmp_algorithm(bool , is_sorted, %arg(const T *DATA, size_t DATASIZE),
138
+ %flc_cmp_algorithm(bool , is_sorted,
139
+ %arg(const T *DATA, size_t DATASIZE),
136
140
%arg(DATA, DATASIZE))
137
- %flc_cmp_algorithm(void , argsort, %arg(const T *DATA, size_t DATASIZE,
138
- index_int *IDX, size_t IDXSIZE),
141
+ %flc_cmp_algorithm(void , argsort,
142
+ %arg(const T *DATA, size_t DATASIZE,
143
+ index_int *IDX, size_t IDXSIZE),
139
144
%arg(DATA, DATASIZE, IDX, IDXSIZE))
140
145
141
- /* *****************************
142
- * Searching
143
- ***************************** */
146
+ /* -------------------------------------------------------------------------
147
+ * Searching routines
148
+ * ------------------------------------------------------------------------- */
144
149
145
150
%{
146
151
template <class T , class Compare >
147
- static index_int binary_search_impl (const T *data, size_t size, T value, Compare cmp) {
152
+ static index_int binary_search_impl (const T *data, size_t size, T value,
153
+ Compare cmp) {
148
154
const T *end = data + size;
149
155
auto iter = std::lower_bound (data, end, value, cmp);
150
156
if (iter == end || cmp (*iter, value) || cmp (value, *iter))
@@ -154,7 +160,9 @@ static index_int binary_search_impl(const T *data, size_t size, T value, Compare
154
160
}
155
161
156
162
template <class T , class Compare >
157
- static void equal_range_impl (const T *data, size_t size, T value, index_int &first_index, index_int &last_index, Compare cmp) {
163
+ static void equal_range_impl (const T *data, size_t size, T value,
164
+ index_int &first_index, index_int &last_index,
165
+ Compare cmp) {
158
166
const T *end = data + size;
159
167
auto range_pair = std::equal_range (data, end, value, cmp);
160
168
// Index of the min/max items *IN FORTAN INDEXING*
@@ -163,7 +171,9 @@ static void equal_range_impl(const T *data, size_t size, T value, index_int &fir
163
171
}
164
172
165
173
template <class T , class Compare >
166
- static void minmax_element_impl (const T *data, size_t size, index_int &min_index, index_int &max_index, Compare cmp) {
174
+ static void minmax_element_impl (const T *data, size_t size,
175
+ index_int &min_index, index_int &max_index,
176
+ Compare cmp) {
167
177
const T *end = data + size;
168
178
auto mm_pair = std::minmax_element (data, end, cmp);
169
179
// Index of the min/max items *IN FORTAN INDEXING*
@@ -172,37 +182,41 @@ static void minmax_element_impl(const T *data, size_t size, index_int &min_index
172
182
}
173
183
%}
174
184
175
- %flc_cmp_algorithm(index_int, binary_search, %arg( const T *DATA, size_t DATASIZE,
176
- T value),
185
+ %flc_cmp_algorithm(index_int, binary_search,
186
+ %arg( const T *DATA, size_t DATASIZE, T value),
177
187
%arg(DATA, DATASIZE, value))
178
188
179
- %flc_cmp_algorithm(void , equal_range, %arg( const T *DATA, size_t DATASIZE,
180
- T value,
181
- index_int &first_index, index_int &last_index),
189
+ %flc_cmp_algorithm(void , equal_range,
190
+ %arg( const T *DATA, size_t DATASIZE, T value,
191
+ index_int &first_index, index_int &last_index),
182
192
%arg(DATA, DATASIZE, value, first_index, last_index))
183
193
184
- %flc_cmp_algorithm(void , minmax_element, %arg(const T *DATA, size_t DATASIZE,
185
- index_int &min_index, index_int &max_index),
194
+ %flc_cmp_algorithm(void , minmax_element,
195
+ %arg(const T *DATA, size_t DATASIZE,
196
+ index_int &min_index, index_int &max_index),
186
197
%arg(DATA, DATASIZE, min_index, max_index))
187
198
188
- /* *****************************
189
- * Set operations
190
- ***************************** */
199
+ /* -------------------------------------------------------------------------
200
+ * Set operation routines
201
+ * ------------------------------------------------------------------------- */
191
202
192
203
%{
193
204
template <class T , class Compare >
194
- static bool includes_impl (const T *data1, size_t size1, const T *data2, size_t size2, Compare cmp) {
205
+ static bool includes_impl (const T *data1, size_t size1,
206
+ const T *data2, size_t size2,
207
+ Compare cmp) {
195
208
return std::includes (data1, data1 + size1, data2, data2 + size2, cmp);
196
209
}
197
210
%}
198
211
199
- %flc_cmp_algorithm(bool , includes, %arg(const T *DATA1, size_t DATASIZE1,
200
- const T *DATA2, size_t DATASIZE2),
212
+ %flc_cmp_algorithm(bool , includes,
213
+ %arg(const T *DATA1, size_t DATASIZE1,
214
+ const T *DATA2, size_t DATASIZE2),
201
215
%arg(DATA1, DATASIZE1, DATA2, DATASIZE2))
202
216
203
- /* *****************************
204
- * Reordering
205
- ***************************** */
217
+ /* -------------------------------------------------------------------------
218
+ * Modifying routines
219
+ * ------------------------------------------------------------------------- */
206
220
207
221
%{
208
222
#include < random>
0 commit comments