@@ -161,10 +161,12 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
161161
162162 // Calculate the minimum and maximum lengths of the strings in the dictionary. Several of the analyses need this.
163163 int minLength = int . MaxValue , maxLength = 0 ;
164+ ulong lengthFilter = 0 ;
164165 foreach ( string key in keys )
165166 {
166167 if ( key . Length < minLength ) minLength = key . Length ;
167168 if ( key . Length > maxLength ) maxLength = key . Length ;
169+ lengthFilter |= ( 1UL << ( key . Length % 64 ) ) ;
168170 }
169171 Debug . Assert ( minLength >= 0 && maxLength >= minLength ) ;
170172
@@ -184,29 +186,29 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
184186 if ( analysis . IgnoreCase )
185187 {
186188 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 ) ;
189191 }
190192 else
191193 {
192194 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 ) ;
195197 }
196198 }
197199 else
198200 {
199201 if ( analysis . IgnoreCase )
200202 {
201203 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 ) ;
204206 }
205207 else
206208 {
207209 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 ) ;
210212 }
211213 }
212214 }
@@ -215,12 +217,12 @@ private static FrozenDictionary<TKey, TValue> CreateFromDictionary<TKey, TValue>
215217 if ( analysis . IgnoreCase )
216218 {
217219 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 ) ;
220222 }
221223 else
222224 {
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 ) ;
224226 }
225227 }
226228
0 commit comments