45 int aBaseUnits,
int aBaseBodyStyles, std::span<const PIN_COMPARISON_DATA> basePins,
46 int aCandidateUnits,
int aCandidateBodyStyles, std::span<const PIN_COMPARISON_DATA> candidatePins )
48 std::vector<VARIANT_COMPAT_RESULT> results;
50 int baseUnits = std::max( aBaseUnits, 1 );
51 int candUnits = std::max( aCandidateUnits, 1 );
53 if( candUnits < baseUnits )
57 result.detail = wxString::Format(
_(
"Candidate has %d unit(s), base requires %d" ),
58 candUnits, baseUnits );
59 results.push_back(
result );
62 int baseBodyStyles = aBaseBodyStyles;
64 if( baseBodyStyles > 1 && aCandidateBodyStyles < baseBodyStyles )
68 result.detail = wxString::Format(
_(
"Candidate has %d body style(s), base requires %d" ),
69 aCandidateBodyStyles, baseBodyStyles );
70 results.push_back(
result );
79 std::vector<bool> matched( candidatePins.size(),
false );
85 return basePin.number == aCandidatePin.number
86 && basePin.unit == aCandidatePin.unit
87 && basePin.bodyStyle == aCandidatePin.bodyStyle;
90 auto findCandidate = [&](
bool aRequirePosition,
bool aRequireType )
92 for(
size_t i = 0; i < candidatePins.size(); ++i )
94 if( matched[i] || !sameSlot( candidatePins[i] ) )
97 if( aRequirePosition && candidatePins[i].position != basePin.position )
100 if( aRequireType && type( candidatePins[i] ) != type( basePin ) )
106 return candidatePins.size();
109 size_t candidateIndex = findCandidate(
true,
true );
111 if( candidateIndex == candidatePins.size() )
112 candidateIndex = findCandidate(
true,
false );
114 if( candidateIndex == candidatePins.size() )
115 candidateIndex = findCandidate(
false,
false );
117 if( candidateIndex == candidatePins.size() )
121 result.pinNumber = basePin.number;
122 result.unit = basePin.unit;
123 result.bodyStyle = basePin.bodyStyle;
124 result.detail = wxString::Format(
125 _(
"Unit %d, body style %d: pin '%s' not found in candidate" ),
127 results.push_back(
result );
131 matched[candidateIndex] =
true;
132 const auto& candidatePin = candidatePins[candidateIndex];
134 if( candidatePin.position != basePin.position )
138 result.pinNumber = basePin.number;
139 result.unit = basePin.unit;
140 result.bodyStyle = basePin.bodyStyle;
141 result.detail = wxString::Format(
142 _(
"Unit %d, body style %d: pin '%s' position mismatch "
143 "(%d,%d) vs (%d,%d)" ),
145 basePin.position.x, basePin.position.y,
146 candidatePin.position.x, candidatePin.position.y );
147 results.push_back(
result );
150 if( type( candidatePin ) != type( basePin ) )
154 result.pinNumber = basePin.number;
155 result.unit = basePin.unit;
156 result.bodyStyle = basePin.bodyStyle;
157 result.detail = wxString::Format(
158 _(
"Unit %d, body style %d: pin '%s' type mismatch ('%s' vs '%s')" ),
162 results.push_back(
result );
166 for(
size_t i = 0; i < candidatePins.size(); ++i )
170 const auto& candidatePin = candidatePins[i];
173 result.pinNumber = candidatePin.number;
174 result.unit = candidatePin.unit;
175 result.bodyStyle = candidatePin.bodyStyle;
176 result.detail = wxString::Format(
177 _(
"Unit %d, body style %d: candidate has extra pin '%s'" ),
179 results.push_back(
result );
wxString result
Test unit parsing edge cases and error handling.
static std::vector< VARIANT_COMPAT_RESULT > validateCompatibility(int aBaseUnits, int aBaseBodyStyles, std::span< const PIN_COMPARISON_DATA > basePins, int aCandidateUnits, int aCandidateBodyStyles, std::span< const PIN_COMPARISON_DATA > candidatePins)