internal SearchProcessingUnit_A_KnuthMorrisPratt(IntT[] skip_table, IntT skip_table_start, TListPattern pattern, IntT pattern_start, IntT pattern_count, TEqualityComparer equalityComparer) { this.skip_table = skip_table; this.skip_table_start = skip_table_start; this.equalityComparer = equalityComparer; this.pattern = pattern; this.pattern_start = pattern_start; this.pattern_count = pattern_count; }
public static SearchProcessingUnit_A_KnuthMorrisPratt <T, TListPattern, TEqualityComparer, TAllocator> Create(TListPattern pattern, IntT start, IntT count, TEqualityComparer equalityComparer, TAllocator allocator) { if (count > 0) { var(skip_table, skip_table_start) = allocator.Invoke(count); var i = (IntT)0; var j = -1; skip_table[skip_table_start] = j; while (count - 1 > i) { while (j > -1 && !equalityComparer.Invoke(pattern[start + i], pattern[start + j])) { j = skip_table[skip_table_start + j]; } ++i; ++j; if (equalityComparer.Invoke(pattern[start + i], pattern[start + j])) { skip_table[skip_table_start + i] = skip_table[skip_table_start + j]; } else { skip_table[skip_table_start + i] = j; } } return(new SearchProcessingUnit_A_KnuthMorrisPratt <T, TListPattern, TEqualityComparer, TAllocator>(skip_table, skip_table_start, pattern, start, count, equalityComparer)); } { return(new SearchProcessingUnit_A_KnuthMorrisPratt <T, TListPattern, TEqualityComparer, TAllocator>(Array_Empty <IntT> .Value, 0, pattern, start, count, equalityComparer)); } }