1/* GENERATED SOURCE. DO NOT MODIFY. */
2// © 2016 and later: Unicode, Inc. and others.
3// License & terms of use: http://www.unicode.org/copyright.html#License
4/*
5 *******************************************************************************
6 * Copyright (C) 2014, International Business Machines Corporation and         *
7 * others. All Rights Reserved.                                                *
8 *******************************************************************************
9 */
10package android.icu.text;
11
12import java.text.CharacterIterator;
13
14import android.icu.impl.Assert;
15import android.icu.util.BytesTrie;
16import android.icu.util.BytesTrie.Result;
17
18class BytesDictionaryMatcher extends DictionaryMatcher {
19    private final byte[] characters;
20    private final int transform;
21
22    public BytesDictionaryMatcher(byte[] chars, int transform) {
23        characters = chars;
24        Assert.assrt((transform & DictionaryData.TRANSFORM_TYPE_MASK) == DictionaryData.TRANSFORM_TYPE_OFFSET);
25        // while there is only one transform type so far, save the entire transform constant so that
26        // if we add any others, we need only change code in transform() and the assert above rather
27        // than adding a "transform type" variable
28        this.transform = transform;
29    }
30
31    private int transform(int c) {
32        if (c == 0x200D) {
33            return 0xFF;
34        } else if (c == 0x200C) {
35            return 0xFE;
36        }
37
38        int delta = c - (transform & DictionaryData.TRANSFORM_OFFSET_MASK);
39        if (delta < 0 || 0xFD < delta) {
40            return -1;
41        }
42        return delta;
43    }
44
45    @Override
46    public int matches(CharacterIterator text_, int maxLength, int[] lengths, int[] count_, int limit, int[] values) {
47        UCharacterIterator text = UCharacterIterator.getInstance(text_);
48        BytesTrie bt = new BytesTrie(characters, 0);
49        int c = text.nextCodePoint();
50        if (c == UCharacterIterator.DONE) {
51            return 0;
52        }
53        Result result = bt.first(transform(c));
54        // TODO: should numChars count Character.charCount() ?
55        int numChars = 1;
56        int count = 0;
57        for (;;) {
58            if (result.hasValue()) {
59                if (count < limit) {
60                    if (values != null) {
61                        values[count] = bt.getValue();
62                    }
63                    lengths[count] = numChars;
64                    count++;
65                }
66                if (result == Result.FINAL_VALUE) {
67                    break;
68                }
69            } else if (result == Result.NO_MATCH) {
70                break;
71            }
72
73            if (numChars >= maxLength) {
74                break;
75            }
76
77            c = text.nextCodePoint();
78            if (c == UCharacterIterator.DONE) {
79                break;
80            }
81            ++numChars;
82            result = bt.next(transform(c));
83        }
84        count_[0] = count;
85        return numChars;
86    }
87
88    @Override
89    public int getType() {
90        return DictionaryData.TRIE_TYPE_BYTES;
91    }
92}
93
94
95