Пример #1
0
            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);
            }
Пример #2
0
            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]]);
            }
Пример #3
0
        public ListFast <int> AddFast()
        {
            ListFast <int> list = new ListFast <int>();

            for (int i = 0; i < Count; i++)
            {
                list.Add(i);
            }
            return(list);
        }
Пример #4
0
        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);
        }
Пример #5
0
            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);
            }