44 int aBaseUnits,
int aBaseBodyStyles, std::span<const PIN_COMPARISON_DATA> basePins,
45 int aCandidateUnits,
int aCandidateBodyStyles, std::span<const PIN_COMPARISON_DATA> candidatePins )
47 std::vector<VARIANT_COMPAT_RESULT> results;
49 int baseUnits = std::max( aBaseUnits, 1 );
50 int candUnits = std::max( aCandidateUnits, 1 );
52 if( candUnits < baseUnits )
56 result.detail = wxString::Format(
_(
"Candidate has %d unit(s), base requires %d" ),
57 candUnits, baseUnits );
58 results.push_back(
result );
61 int baseBodyStyles = aBaseBodyStyles;
63 if( baseBodyStyles > 1 && aCandidateBodyStyles < baseBodyStyles )
67 result.detail = wxString::Format(
_(
"Candidate has %d body style(s), base requires %d" ),
68 aCandidateBodyStyles, baseBodyStyles );
69 results.push_back(
result );
78 std::vector<bool> matched( candidatePins.size(),
false );
84 return basePin.number == aCandidatePin.number
85 && basePin.unit == aCandidatePin.unit
86 && basePin.bodyStyle == aCandidatePin.bodyStyle;
89 auto findCandidate = [&](
bool aRequirePosition,
bool aRequireType )
91 for(
size_t i = 0; i < candidatePins.size(); ++i )
93 if( matched[i] || !sameSlot( candidatePins[i] ) )
96 if( aRequirePosition && candidatePins[i].position != basePin.position )
99 if( aRequireType && type( candidatePins[i] ) != type( basePin ) )
105 return candidatePins.size();
108 size_t candidateIndex = findCandidate(
true,
true );
110 if( candidateIndex == candidatePins.size() )
111 candidateIndex = findCandidate(
true,
false );
113 if( candidateIndex == candidatePins.size() )
114 candidateIndex = findCandidate(
false,
false );
116 if( candidateIndex == candidatePins.size() )
120 result.pinNumber = basePin.number;
121 result.unit = basePin.unit;
122 result.bodyStyle = basePin.bodyStyle;
123 result.detail = wxString::Format(
124 _(
"Unit %d, body style %d: pin '%s' not found in candidate" ),
126 results.push_back(
result );
130 matched[candidateIndex] =
true;
131 const auto& candidatePin = candidatePins[candidateIndex];
133 if( candidatePin.position != basePin.position )
137 result.pinNumber = basePin.number;
138 result.unit = basePin.unit;
139 result.bodyStyle = basePin.bodyStyle;
140 result.detail = wxString::Format(
141 _(
"Unit %d, body style %d: pin '%s' position mismatch "
142 "(%d,%d) vs (%d,%d)" ),
144 basePin.position.x, basePin.position.y,
145 candidatePin.position.x, candidatePin.position.y );
146 results.push_back(
result );
149 if( type( candidatePin ) != type( basePin ) )
153 result.pinNumber = basePin.number;
154 result.unit = basePin.unit;
155 result.bodyStyle = basePin.bodyStyle;
156 result.detail = wxString::Format(
157 _(
"Unit %d, body style %d: pin '%s' type mismatch ('%s' vs '%s')" ),
161 results.push_back(
result );
165 for(
size_t i = 0; i < candidatePins.size(); ++i )
169 const auto& candidatePin = candidatePins[i];
172 result.pinNumber = candidatePin.number;
173 result.unit = candidatePin.unit;
174 result.bodyStyle = candidatePin.bodyStyle;
175 result.detail = wxString::Format(
176 _(
"Unit %d, body style %d: candidate has extra pin '%s'" ),
178 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)