Exemple #1
0
        public void EmptyCharSet_RemoveCharacterRange_Success()
        {
            var charset = new CharSet();

            charset.Remove('a', 'c');
            Assert.AreEqual(0, charset.Length);
        }
Exemple #2
0
        public void ThreeCharsSet_RemoveCharacterRangeExact_Success()
        {
            var charset = new CharSet();

            charset.Add('a', 'c');
            charset.Remove('a', 'c');
            Assert.AreEqual(0, charset.Length);
        }
Exemple #3
0
        public void OneCharSet_RemoveSingleCharacter_Success()
        {
            var charset = new CharSet();

            charset.Add('a');
            charset.Remove('a');
            Assert.AreEqual(0, charset.Length);
        }
Exemple #4
0
        public void ThreeCharsSet_RemoveCharacterRangeOverlapRight_Success()
        {
            var charset = new CharSet();

            charset.Add('a', 'c');
            charset.Remove('b', 'd');
            Assert.AreEqual(1, charset.Length);
            Assert.IsTrue(charset.Includes('a'));
        }
Exemple #5
0
        public void ThreeCharsSet_RemoveSingleCharacterRight_Success()
        {
            var charset = new CharSet();

            charset.Add('a', 'c');
            charset.Remove('c');
            Assert.AreEqual(2, charset.Length);
            Assert.IsTrue(charset.Includes('a'));
            Assert.IsTrue(charset.Includes('b'));
        }
Exemple #6
0
        /// <summary>
        /// 返回指定的字符对应的字符类索引。
        /// </summary>
        /// <param name="ch">要获取字符类索引的字符。</param>
        /// <returns>字符对应的字符类索引。</returns>
        public HashSet <int> GetCharClass(char ch)
        {
            int           cnt    = charClassList.Count;
            HashSet <int> result = new HashSet <int>();

            for (int i = 0; i < cnt; i++)
            {
                CharSet cc = charClassList[i];
                if (cc.Contains(ch))
                {
                    if (cc.Count == 1)
                    {
                        // 完全包含当前字符类,直接添加。
                        result.Add(i);
                    }
                    else
                    {
                        // 当前的字符类需要被分割,从当前的字符类中剔除被分割的部分。
                        cc.Remove(ch);
                        // 添加新字符类。
                        int newCC = charClassList.Count;
                        result.Add(newCC);
                        charClassList.Add(new CharSet()
                        {
                            ch
                        });
                        // 这里虽然在 charClassRecord 里添加了新的项,但完全没有必要记录。
                        // 因为当前的字符类只包含一个字符,不可能再被分割了。
                        charClassRecord.Add(null);
                        // 更新旧的字符类。
                        List <HashSet <int> > record = charClassRecord[i];
                        int rCnt = record.Count;
                        for (int j = 0; j < rCnt; j++)
                        {
                            record[j].Add(newCC);
                        }
                    }
                }
            }
            return(result);
        }
Exemple #7
0
 /// <summary>
 /// Static constructor.
 /// </summary>
 static SubFieldCode()
 {
     _validCodes = new CharSet();
     _validCodes.AddRange(DefaultFirstCode, DefaultLastCode);
     _validCodes.Remove('^');
 }