Skip to content

Commit 4a22179

Browse files
committed
Vutils
1 parent b762630 commit 4a22179

File tree

2 files changed

+42
-21
lines changed

2 files changed

+42
-21
lines changed

include/Vutils.h

+12-2
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,20 @@ intptr vuapi gcd(ulongptr count, ...); // UCLN
233233
intptr vuapi lcm(ulongptr count, ...); // BCNN
234234
void vuapi hex_dump(const void* data, int size);
235235
float vuapi fast_sqrtf(const float number); // Estimates the square root of a 32-bit floating-point number (from Quake III Arena)
236+
237+
struct piece_t
238+
{
239+
size_t idx;
240+
size_t beg;
241+
size_t end;
242+
size_t num;
243+
piece_t() : idx(0), beg(0), end(0), num(0) {}
244+
};
245+
236246
void divide_items_into_pieces(const size_t num_items, const size_t num_pieces,
237-
std::function<void(size_t idx, size_t beg, size_t end, size_t num)> fn);
247+
std::function<void(const piece_t& piece)> fn);
238248
size_t divide_items_into_num_items_per_piece(const size_t num_items, const size_t num_items_per_piece,
239-
std::function<void(size_t idx, size_t beg, size_t end, size_t num)> fn);
249+
std::function<void(const piece_t& piece)> fn);
240250

241251
#include "template/math.tpl"
242252

src/details/math.cpp

+30-19
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ float vuapi fast_sqrtf(const float number)
133133
* @param[in] num_items The number of items.
134134
* @param[in] num_pieces The number of pieces.
135135
* @param[in] fn The function that apply to each piece.
136-
* idx The piece index.
137-
* beg The index of the begin item in piece.
138-
* end The index of the end item in piece.
139-
* num The number of items in piece.
136+
* piece.idx The piece index.
137+
* piece.beg The index of the begin item in piece.
138+
* piece.end The index of the end item in piece.
139+
* piece.num The number of items in piece.
140140
* Eg. In these cases, the number of items of each piece as the following:
141141
* (4, 1) => (4)
142142
* (4, 2) => (2, 2)
@@ -145,7 +145,7 @@ float vuapi fast_sqrtf(const float number)
145145
* (4, 5) => (1, 1, 1, 1, 0)
146146
*/
147147
void divide_items_into_pieces(const size_t num_items, const size_t num_pieces,
148-
std::function<void(size_t idx, size_t beg, size_t end, size_t num)> fn)
148+
std::function<void(const piece_t& piece)> fn)
149149
{
150150
if (fn == nullptr)
151151
{
@@ -154,17 +154,20 @@ void divide_items_into_pieces(const size_t num_items, const size_t num_pieces,
154154

155155
size_t num_items_per_piece = std::max(1, int(num_items / float(num_pieces) + 0.5F));
156156

157+
piece_t piece;
158+
157159
for (size_t idx = 0; idx < num_pieces; ++idx)
158160
{
159161
size_t beg = idx * num_items_per_piece;
160162
size_t end = idx == num_pieces - 1 ? num_items : (idx + 1) * num_items_per_piece;
161163
size_t num = end - beg;
162164

163-
beg = idx < num_items ? beg : -1;
164-
end = idx < num_items ? end - 1 : -1;
165-
num = idx < num_items ? num : 0;
165+
piece.idx = idx;
166+
piece.beg = idx < num_items ? beg : -1;
167+
piece.end = idx < num_items ? end - 1 : -1;
168+
piece.num = idx < num_items ? num : 0;
166169

167-
fn(idx, beg, end, num);
170+
fn(piece);
168171
}
169172
}
170173

@@ -173,40 +176,48 @@ void divide_items_into_pieces(const size_t num_items, const size_t num_pieces,
173176
* @param[in] num_items The number of items.
174177
* @param[in] num_pieces The number of item per piece.
175178
* @param[in] fn The function that apply to each piece.
176-
* idx The piece index.
177-
* beg The index of the begin item in piece.
178-
* end The index of the end item in piece.
179-
* num The number of items in piece.
179+
* piece.idx The piece index.
180+
* piece.beg The index of the begin item in piece.
181+
* piece.end The index of the end item in piece.
182+
* piece.num The number of items in piece.
180183
* @return The number of pieces.
181184
* Eg. The number of items of each piece as the following.
182185
* (4, 1) => (1, 1, 1, 1)
183186
* (4, 2) => (2, 2)
184-
* (4, 3) => (3, 1, 1)
187+
* (4, 3) => (3, 1)
185188
* (4, 4) => (4)
186189
* (4, 5) => (4)
187190
*/
188191
size_t divide_items_into_num_items_per_piece(const size_t num_items, const size_t num_items_per_piece,
189-
std::function<void(size_t idx, size_t beg, size_t end, size_t num)> fn)
192+
std::function<void(const piece_t& piece)> fn)
190193
{
191194
if (fn == nullptr)
192195
{
193196
return 0;
194197
}
195198

199+
piece_t piece;
200+
196201
size_t result = 0;
197202

198-
std::vector<size_t> piece;
203+
std::vector<size_t> temp;
199204

200205
for (size_t j = 1; j <= num_items; j++)
201206
{
202207
size_t i = j - 1;
203208

204-
piece.push_back(i);
209+
temp.push_back(i);
205210

206211
if (j % num_items_per_piece == 0 || i == num_items - 1)
207212
{
208-
fn(result, piece.front(), piece.back(), piece.size());
209-
piece.clear();
213+
piece.idx = result;
214+
piece.beg = temp.front();
215+
piece.end = temp.back();
216+
piece.num = temp.size();
217+
218+
fn(piece);
219+
220+
temp.clear();
210221
result += 1;
211222
}
212223
}

0 commit comments

Comments
 (0)