@@ -236,10 +236,9 @@ static void ApproximateBestSubset(const std::vector<OutputGroup>& groups, const
236
236
}
237
237
}
238
238
239
- bool KnapsackSolver (const CAmount& nTargetValue, std::vector<OutputGroup>& groups, std::set<CInputCoin>& setCoinsRet, CAmount& nValueRet )
239
+ std::optional<SelectionResult> KnapsackSolver (std::vector<OutputGroup>& groups, const CAmount& nTargetValue )
240
240
{
241
- setCoinsRet.clear ();
242
- nValueRet = 0 ;
241
+ SelectionResult result (nTargetValue);
243
242
244
243
// List of values less than target
245
244
std::optional<OutputGroup> lowest_larger;
@@ -250,9 +249,8 @@ bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& group
250
249
251
250
for (const OutputGroup& group : groups) {
252
251
if (group.GetSelectionAmount () == nTargetValue) {
253
- util::insert (setCoinsRet, group.m_outputs );
254
- nValueRet += group.m_value ;
255
- return true ;
252
+ result.AddInput (group);
253
+ return result;
256
254
} else if (group.GetSelectionAmount () < nTargetValue + MIN_CHANGE) {
257
255
applicable_groups.push_back (group);
258
256
nTotalLower += group.GetSelectionAmount ();
@@ -263,17 +261,15 @@ bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& group
263
261
264
262
if (nTotalLower == nTargetValue) {
265
263
for (const auto & group : applicable_groups) {
266
- util::insert (setCoinsRet, group.m_outputs );
267
- nValueRet += group.m_value ;
264
+ result.AddInput (group);
268
265
}
269
- return true ;
266
+ return result ;
270
267
}
271
268
272
269
if (nTotalLower < nTargetValue) {
273
- if (!lowest_larger) return false ;
274
- util::insert (setCoinsRet, lowest_larger->m_outputs );
275
- nValueRet += lowest_larger->m_value ;
276
- return true ;
270
+ if (!lowest_larger) return std::nullopt;
271
+ result.AddInput (*lowest_larger);
272
+ return result;
277
273
}
278
274
279
275
// Solve subset sum by stochastic approximation
@@ -290,13 +286,11 @@ bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& group
290
286
// or the next bigger coin is closer), return the bigger coin
291
287
if (lowest_larger &&
292
288
((nBest != nTargetValue && nBest < nTargetValue + MIN_CHANGE) || lowest_larger->GetSelectionAmount () <= nBest)) {
293
- util::insert (setCoinsRet, lowest_larger->m_outputs );
294
- nValueRet += lowest_larger->m_value ;
289
+ result.AddInput (*lowest_larger);
295
290
} else {
296
291
for (unsigned int i = 0 ; i < applicable_groups.size (); i++) {
297
292
if (vfBest[i]) {
298
- util::insert (setCoinsRet, applicable_groups[i].m_outputs );
299
- nValueRet += applicable_groups[i].m_value ;
293
+ result.AddInput (applicable_groups[i]);
300
294
}
301
295
}
302
296
@@ -311,7 +305,7 @@ bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& group
311
305
}
312
306
}
313
307
314
- return true ;
308
+ return result ;
315
309
}
316
310
317
311
/* *****************************************************************************
0 commit comments