175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi/*
275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project
375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi *
475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * you may not use this file except in compliance with the License.
675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * You may obtain a copy of the License at
775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi *
875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi *
1075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
1175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
1275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * See the License for the specific language governing permissions and
1475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi * limitations under the License.
1575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi */
1675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
1775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagipackage com.android.inputmethod.latin.makedict;
1875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
19aa7abb2d89e559d3e8969b35fe2c75a8793495f1Keisuke Kuroyanagiimport com.android.inputmethod.annotations.UsedForTesting;
2075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagiimport com.android.inputmethod.latin.BinaryDictionary;
21b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport com.android.inputmethod.latin.utils.CombinedFormatUtils;
2275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
235f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagiimport java.util.Arrays;
245f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi
2575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagipublic final class ProbabilityInfo {
2675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public final int mProbability;
2775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    // mTimestamp, mLevel and mCount are historical info. These values are depend on the
2875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    // implementation in native code; thus, we must not use them and have any assumptions about
2975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    // them except for tests.
3075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public final int mTimestamp;
3175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public final int mLevel;
3275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public final int mCount;
3375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
34aa7abb2d89e559d3e8969b35fe2c75a8793495f1Keisuke Kuroyanagi    @UsedForTesting
358ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi    public static ProbabilityInfo max(final ProbabilityInfo probabilityInfo1,
368ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi            final ProbabilityInfo probabilityInfo2) {
378ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi        if (probabilityInfo1 == null) {
388ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi            return probabilityInfo2;
398ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi        }
408ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi        if (probabilityInfo2 == null) {
418ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi            return probabilityInfo1;
428ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi        }
435f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka        return (probabilityInfo1.mProbability > probabilityInfo2.mProbability) ? probabilityInfo1
445f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka                : probabilityInfo2;
458ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi    }
468ffc631826b108423f98e3ff4d987f067cbc4e0cKeisuke Kuroyanagi
4775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public ProbabilityInfo(final int probability) {
4875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi        this(probability, BinaryDictionary.NOT_A_VALID_TIMESTAMP, 0, 0);
4975a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    }
5075a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
5175a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public ProbabilityInfo(final int probability, final int timestamp, final int level,
5275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi            final int count) {
5375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi        mProbability = probability;
5475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi        mTimestamp = timestamp;
5575a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi        mLevel = level;
5675a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi        mCount = count;
5775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    }
5875a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi
59df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi    public boolean hasHistoricalInfo() {
60df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi        return mTimestamp != BinaryDictionary.NOT_A_VALID_TIMESTAMP;
61df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi    }
62df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi
6375a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    @Override
645f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi    public int hashCode() {
655f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        if (hasHistoricalInfo()) {
665f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi            return Arrays.hashCode(new Object[] { mProbability, mTimestamp, mLevel, mCount });
675f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        }
685f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka        return Arrays.hashCode(new Object[] { mProbability });
695f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi    }
705f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi
715f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi    @Override
7275a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    public String toString() {
73b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi        return CombinedFormatUtils.formatProbabilityInfo(this);
7475a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi    }
75df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi
76df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi    @Override
77df1d3e733e2b000c776e74b54d3c62f0d433b013Keisuke Kuroyanagi    public boolean equals(Object o) {
785f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        if (o == this) return true;
795f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        if (!(o instanceof ProbabilityInfo)) return false;
805f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        final ProbabilityInfo p = (ProbabilityInfo)o;
815f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        if (!hasHistoricalInfo() && !p.hasHistoricalInfo()) {
825f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi            return mProbability == p.mProbability;
835f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        }
845f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi        return mProbability == p.mProbability && mTimestamp == p.mTimestamp && mLevel == p.mLevel
855f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi                && mCount == p.mCount;
865f5feeba13f6f1a907d90365d8037a361d0ff5daKeisuke Kuroyanagi    }
8775a3df30f6282e4ff93a5c71c7d55fbbcf462d0aKeisuke Kuroyanagi}