@@ -161,10 +161,12 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
161
161
162
162
// Calculate the minimum and maximum lengths of the strings in the dictionary. Several of the analyses need this.
163
163
int minLength = int . MaxValue , maxLength = 0 ;
164
+ ulong lengthFilter = 0 ;
164
165
foreach ( string key in keys )
165
166
{
166
167
if ( key . Length < minLength ) minLength = key . Length ;
167
168
if ( key . Length > maxLength ) maxLength = key . Length ;
169
+ lengthFilter |= ( 1UL << ( key . Length % 64 ) ) ;
168
170
}
169
171
Debug . Assert ( minLength >= 0 && maxLength >= minLength ) ;
170
172
@@ -184,29 +186,29 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
184
186
if ( analysis . IgnoreCase )
185
187
{
186
188
frozenDictionary = analysis . AllAsciiIfIgnoreCase
187
- ? new OrdinalStringFrozenDictionary_RightJustifiedCaseInsensitiveAsciiSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount )
188
- : new OrdinalStringFrozenDictionary_RightJustifiedCaseInsensitiveSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount ) ;
189
+ ? new OrdinalStringFrozenDictionary_RightJustifiedCaseInsensitiveAsciiSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount )
190
+ : new OrdinalStringFrozenDictionary_RightJustifiedCaseInsensitiveSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount ) ;
189
191
}
190
192
else
191
193
{
192
194
frozenDictionary = analysis . HashCount == 1
193
- ? new OrdinalStringFrozenDictionary_RightJustifiedSingleChar < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex )
194
- : new OrdinalStringFrozenDictionary_RightJustifiedSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount ) ;
195
+ ? new OrdinalStringFrozenDictionary_RightJustifiedSingleChar < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex )
196
+ : new OrdinalStringFrozenDictionary_RightJustifiedSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount ) ;
195
197
}
196
198
}
197
199
else
198
200
{
199
201
if ( analysis . IgnoreCase )
200
202
{
201
203
frozenDictionary = analysis . AllAsciiIfIgnoreCase
202
- ? new OrdinalStringFrozenDictionary_LeftJustifiedCaseInsensitiveAsciiSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount )
203
- : new OrdinalStringFrozenDictionary_LeftJustifiedCaseInsensitiveSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount ) ;
204
+ ? new OrdinalStringFrozenDictionary_LeftJustifiedCaseInsensitiveAsciiSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount )
205
+ : new OrdinalStringFrozenDictionary_LeftJustifiedCaseInsensitiveSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount ) ;
204
206
}
205
207
else
206
208
{
207
209
frozenDictionary = analysis . HashCount == 1
208
- ? new OrdinalStringFrozenDictionary_LeftJustifiedSingleChar < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex )
209
- : new OrdinalStringFrozenDictionary_LeftJustifiedSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter , analysis . HashIndex , analysis . HashCount ) ;
210
+ ? new OrdinalStringFrozenDictionary_LeftJustifiedSingleChar < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex )
211
+ : new OrdinalStringFrozenDictionary_LeftJustifiedSubstring < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter , analysis . HashIndex , analysis . HashCount ) ;
210
212
}
211
213
}
212
214
}
@@ -215,12 +217,12 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
215
217
if ( analysis . IgnoreCase )
216
218
{
217
219
frozenDictionary = analysis . AllAsciiIfIgnoreCase
218
- ? new OrdinalStringFrozenDictionary_FullCaseInsensitiveAscii < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter )
219
- : new OrdinalStringFrozenDictionary_FullCaseInsensitive < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter ) ;
220
+ ? new OrdinalStringFrozenDictionary_FullCaseInsensitiveAscii < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter )
221
+ : new OrdinalStringFrozenDictionary_FullCaseInsensitive < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter ) ;
220
222
}
221
223
else
222
224
{
223
- frozenDictionary = new OrdinalStringFrozenDictionary_Full < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , analysis . LengthFilter ) ;
225
+ frozenDictionary = new OrdinalStringFrozenDictionary_Full < TValue > ( keys , values , stringComparer , analysis . MinimumLength , analysis . MaximumLengthDiff , lengthFilter ) ;
224
226
}
225
227
}
226
228
0 commit comments