public bool TryGetValue(ListFast <char> str, [NotNullWhen(true)] out Symbol?result) { int len = str.Count; if (len is <= MAX_WORD_LENGTH and >= MIN_WORD_LENGTH) { uint key = Hash(str, len); if (key <= MAX_HASH_VALUE) { Symbol?symbol = _symbolTable[key]; if (symbol == null) { result = null; return(false); } if (SeqEqual(str, symbol.Keyword)) { result = symbol; return(true); } } } result = null; return(false); }
private uint Hash(ListFast <char> str, int len) { uint hval = (uint)len; // Original C code does a stupid thing where it puts default at the top and falls through and junk, // but we can't do that in C#, so have something clearer/clunkier switch (len) { case 1: hval += asso_values[str.ItemsArray[0]]; break; case 2: hval += asso_values[str.ItemsArray[1]]; hval += asso_values[str.ItemsArray[0]]; break; default: hval += asso_values[str.ItemsArray[2]]; hval += asso_values[str.ItemsArray[1]]; hval += asso_values[str.ItemsArray[0]]; break; } return(hval + asso_values[str.ItemsArray[len - 1]]); }
public ListFast <int> AddFast() { ListFast <int> list = new ListFast <int>(); for (int i = 0; i < Count; i++) { list.Add(i); } return(list); }
public List <bool> ContainsFast() { List <bool> contains = new List <bool>(); ListFast <int> list = new ListFast <int>(); for (int i = 0; i < Count; i++) { list.Add(i); } for (int i = 0; i < Count; i++) { contains.Add(list.Contains(i * 2)); } return(contains); }
private static bool SeqEqual(ListFast <char> seq1, string seq2) { int seq1Count = seq1.Count; if (seq1Count != seq2.Length) { return(false); } for (int ci = 0; ci < seq1Count; ci++) { if (seq1.ItemsArray[ci] != seq2[ci]) { return(false); } } return(true); }