Home | History | Annotate | Download | only in text
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html#License
      3 /*
      4  *******************************************************************************
      5  * Copyright (C) 2014, International Business Machines Corporation and         *
      6  * others. All Rights Reserved.                                                *
      7  *******************************************************************************
      8  */
      9 package com.ibm.icu.text;
     10 
     11 import java.text.CharacterIterator;
     12 
     13 import com.ibm.icu.util.BytesTrie.Result;
     14 import com.ibm.icu.util.CharsTrie;
     15 
     16 class CharsDictionaryMatcher extends DictionaryMatcher {
     17     private CharSequence characters;
     18 
     19     public CharsDictionaryMatcher(CharSequence chars) {
     20         characters = chars;
     21     }
     22 
     23     @Override
     24     public int matches(CharacterIterator text_, int maxLength, int[] lengths, int[] count_, int limit, int[] values) {
     25         UCharacterIterator text = UCharacterIterator.getInstance(text_);
     26         CharsTrie uct = new CharsTrie(characters, 0);
     27         int c = text.nextCodePoint();
     28         if (c == UCharacterIterator.DONE) {
     29             return 0;
     30         }
     31         Result result = uct.firstForCodePoint(c);
     32         // TODO: should numChars count Character.charCount?
     33         int numChars = 1;
     34         int count = 0;
     35         for (;;) {
     36             if (result.hasValue()) {
     37                 if (count < limit) {
     38                     if (values != null) {
     39                         values[count] = uct.getValue();
     40                     }
     41                     lengths[count] = numChars;
     42                     count++;
     43                 }
     44 
     45                 if (result == Result.FINAL_VALUE) {
     46                     break;
     47                 }
     48             } else if (result == Result.NO_MATCH) {
     49                 break;
     50             }
     51 
     52             if (numChars >= maxLength) {
     53                 break;
     54             }
     55             c = text.nextCodePoint();
     56             if (c == UCharacterIterator.DONE) {
     57                 break;
     58             }
     59             ++numChars;
     60             result = uct.nextForCodePoint(c);
     61         }
     62         count_[0] = count;
     63         return numChars;
     64     }
     65 
     66     @Override
     67     public int getType() {
     68         return DictionaryData.TRIE_TYPE_UCHARS;
     69     }
     70 }
     71 
     72