12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2014, International Business Machines Corporation and * 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.CharacterIterator; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.BytesTrie.Result; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.CharsTrie; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass CharsDictionaryMatcher extends DictionaryMatcher { 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private CharSequence characters; 182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CharsDictionaryMatcher(CharSequence chars) { 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert characters = chars; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int matches(CharacterIterator text_, int maxLength, int[] lengths, int[] count_, int limit, int[] values) { 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacterIterator text = UCharacterIterator.getInstance(text_); 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CharsTrie uct = new CharsTrie(characters, 0); 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int c = text.nextCodePoint(); 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (c == UCharacterIterator.DONE) { 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return 0; 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Result result = uct.firstForCodePoint(c); 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // TODO: should numChars count Character.charCount? 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int numChars = 1; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int count = 0; 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (;;) { 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (result.hasValue()) { 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (count < limit) { 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (values != null) { 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert values[count] = uct.getValue(); 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert lengths[count] = numChars; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert count++; 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (result == Result.FINAL_VALUE) { 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (result == Result.NO_MATCH) { 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (numChars >= maxLength) { 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert c = text.nextCodePoint(); 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (c == UCharacterIterator.DONE) { 572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert break; 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++numChars; 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert result = uct.nextForCodePoint(c); 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert count_[0] = count; 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return numChars; 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int getType() { 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return DictionaryData.TRIE_TYPE_UCHARS; 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 72