121 const std::vector<ITEM_DESCRIPTOR>& aB )
const
126 std::map<KIID_PATH, std::size_t> aIndex;
127 std::map<KIID_PATH, std::size_t> bIndex;
128 std::set<KIID_PATH> aSeen;
129 std::set<KIID_PATH> bSeen;
131 for( std::size_t i = 0; i < aA.size(); ++i )
135 if( aSeen.count(
id ) )
138 && std::find(
result.duplicatesA.begin(),
result.duplicatesA.end(),
id )
139 ==
result.duplicatesA.end() )
141 result.duplicatesA.push_back(
id );
151 for( std::size_t i = 0; i < aB.size(); ++i )
155 if( bSeen.count(
id ) )
158 && std::find(
result.duplicatesB.begin(),
result.duplicatesB.end(),
id )
159 ==
result.duplicatesB.end() )
161 result.duplicatesB.push_back(
id );
181 std::set<std::size_t> matchedB;
183 for(
const auto& [idA, indexA] : aIndex )
185 auto it = bIndex.find( idA );
187 if( it == bIndex.end() )
193 matchedB.insert( it->second );
200 std::vector<std::size_t> unmatchedA;
202 for(
const auto& [idA, indexA] : aIndex )
205 unmatchedA.push_back( indexA );
208 std::vector<std::size_t> unmatchedB;
210 for(
const auto& [idB, indexB] : bIndex )
212 if( matchedB.count( indexB ) == 0 )
213 unmatchedB.push_back( indexB );
229 std::map<wxString, std::vector<std::size_t>> bByType;
231 for( std::size_t bIdx : unmatchedB )
232 bByType[aB[bIdx].type].push_back( bIdx );
238 std::vector<Candidate> candidates;
240 for( std::size_t aIdx : unmatchedA )
242 auto it = bByType.find( aA[aIdx].type );
244 if( it == bByType.end() )
247 for( std::size_t bIdx : it->second )
251 if( s >=
m_config.similarityThreshold )
252 candidates.push_back( { s, aIdx, bIdx } );
256 std::sort( candidates.begin(), candidates.end(),
257 [](
const Candidate& aL,
const Candidate& aR )
259 if( aL.score != aR.score )
260 return aL.score > aR.score;
262 if( aL.aIdx != aR.aIdx )
263 return aL.aIdx < aR.aIdx;
265 return aL.bIdx < aR.bIdx;
268 std::set<std::size_t> usedA;
269 std::set<std::size_t> usedB;
271 for(
const Candidate& c : candidates )
273 if( usedA.count( c.aIdx ) || usedB.count( c.bIdx ) )
276 result.aToB[aA[c.aIdx].id] = aB[c.bIdx].id;
277 result.bToA[aB[c.bIdx].id] = aA[c.aIdx].id;
278 usedA.insert( c.aIdx );
279 usedB.insert( c.bIdx );
280 matchedB.insert( c.bIdx );
281 ++
result.similarityMatches;
286 for(
const auto& [idA, indexA] : aIndex )
289 result.aOnly.insert( idA );
292 for(
const auto& [idB, indexB] : bIndex )
295 result.bOnly.insert( idB );
wxString result
Test unit parsing edge cases and error handling.