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