public unsafe AutomataNode SearchNextSafe(byte[] p, ref int offset, ref int rest)
            {
                var key = AutomataKeyGen.GetKeySafe(p, ref offset, ref rest);

                if (_count < 4)
                {
                    // linear search
                    for (var i = 0; i < _count; i++)
                    {
                        if (_nextKeys[i] == key)
                        {
                            return(_nexts[i]);
                        }
                    }
                }
                else
                {
                    // binary search
                    var index = BinarySearch(_nextKeys, 0, _count, key);
                    if (index >= 0)
                    {
                        return(_nexts[index]);
                    }
                }

                return(null);
            }
        public unsafe void Add(byte[] bytes, int value)
        {
            fixed(byte *buffer = &bytes[0])
            {
                var node = _root;

                var p    = buffer;
                var rest = bytes.Length;

                while (rest != 0)
                {
                    var key = AutomataKeyGen.GetKey(ref p, ref rest);

                    node = rest == 0
                                                ? node.Add(key, value, Encoding.UTF8.GetString(bytes))
                                                : node.Add(key);
                }
            }
        }