/// <summary>
        /// Internal method. Returns 8-bit index value for this rule. This is the low
        /// byte of the first character of the key, unless the first character of the
        /// key is a set. If it's a set, or otherwise can match multiple keys, the
        /// index value is -1.
        /// </summary>
        ///
        internal int GetIndexValue()
        {
            if (anteContextLength == pattern.Length)
            {
                // A pattern with just ante context {such as foo)>bar} can
                // match any key.
                return(-1);
            }
            int c = IBM.ICU.Text.UTF16.CharAt(pattern, anteContextLength);

            return((data.LookupMatcher(c) == null) ? (c & 0xFF) : -1);
        }
        /// <summary>
        /// Implement UnicodeMatcher
        /// </summary>
        ///
        public virtual int Matches(Replaceable text, int[] offset, int limit,
                                   bool incremental)
        {
            // Note (1): We process text in 16-bit code units, rather than
            // 32-bit code points. This works because stand-ins are
            // always in the BMP and because we are doing a literal match
            // operation, which can be done 16-bits at a time.
            int i;

            int[] cursor = new int[] { offset[0] };
            if (limit < cursor[0])
            {
                // Match in the reverse direction
                for (i = pattern.Length - 1; i >= 0; --i)
                {
                    char           keyChar = pattern[i]; // OK; see note (1) above
                    UnicodeMatcher subm    = data.LookupMatcher(keyChar);
                    if (subm == null)
                    {
                        if (cursor[0] > limit && keyChar == text.CharAt(cursor[0]))       // OK;
                                                                                          // see
                                                                                          // note
                                                                                          // (1)
                                                                                          // above
                        {
                            --cursor[0];
                        }
                        else
                        {
                            return(IBM.ICU.Text.UnicodeMatcher_Constants.U_MISMATCH);
                        }
                    }
                    else
                    {
                        int m = subm.Matches(text, cursor, limit, incremental);
                        if (m != IBM.ICU.Text.UnicodeMatcher_Constants.U_MATCH)
                        {
                            return(m);
                        }
                    }
                }
                // Record the match position, but adjust for a normal
                // forward start, limit, and only if a prior match does not
                // exist -- we want the rightmost match.
                if (matchStart < 0)
                {
                    matchStart = cursor[0] + 1;
                    matchLimit = offset[0] + 1;
                }
            }
            else
            {
                for (i = 0; i < pattern.Length; ++i)
                {
                    if (incremental && cursor[0] == limit)
                    {
                        // We've reached the context limit without a mismatch and
                        // without completing our match.
                        return(IBM.ICU.Text.UnicodeMatcher_Constants.U_PARTIAL_MATCH);
                    }
                    char           keyChar_0 = pattern[i]; // OK; see note (1) above
                    UnicodeMatcher subm_1    = data.LookupMatcher(keyChar_0);
                    if (subm_1 == null)
                    {
                        // Don't need the cursor < limit check if
                        // incremental is true (because it's done above); do need
                        // it otherwise.
                        if (cursor[0] < limit && keyChar_0 == text.CharAt(cursor[0]))       // OK;
                                                                                            // see
                                                                                            // note
                                                                                            // (1)
                                                                                            // above
                        {
                            ++cursor[0];
                        }
                        else
                        {
                            return(IBM.ICU.Text.UnicodeMatcher_Constants.U_MISMATCH);
                        }
                    }
                    else
                    {
                        int m_2 = subm_1.Matches(text, cursor, limit, incremental);
                        if (m_2 != IBM.ICU.Text.UnicodeMatcher_Constants.U_MATCH)
                        {
                            return(m_2);
                        }
                    }
                }
                // Record the match position
                matchStart = offset[0];
                matchLimit = cursor[0];
            }

            offset[0] = cursor[0];
            return(IBM.ICU.Text.UnicodeMatcher_Constants.U_MATCH);
        }