150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi/*
250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Copyright (C) 2013 The Android Open Source Project
350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi *
450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * You may obtain a copy of the License at
750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi *
850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi *
1050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
1150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
1250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * See the License for the specific language governing permissions and
1450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * limitations under the License.
1550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi */
1650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
1750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#ifndef LATINIME_SUGGEST_OPTIONS_H
1850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#define LATINIME_SUGGEST_OPTIONS_H
1950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
2050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#include "defines.h"
2150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
2250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanaginamespace latinime {
2350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
2450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagiclass SuggestOptions{
2550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi public:
26338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    SuggestOptions(const int *const options, const int length)
27338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi            : mOptions(options), mLength(length) {}
28338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi
2950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool isGesture() const {
3050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return getBoolOption(IS_GESTURE);
3150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
3250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
3350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool useFullEditDistance() const {
3450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return getBoolOption(USE_FULL_EDIT_DISTANCE);
3550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
3650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
37338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    AK_FORCE_INLINE bool getAdditionalFeaturesBoolOption(const int key) const {
38338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi        return getBoolOption(key + ADDITIONAL_FEATURES_OPTIONS);
39338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    }
4050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
4150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi private:
4229432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa    DISALLOW_IMPLICIT_CONSTRUCTORS(SuggestOptions);
4329432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa
4450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // Need to update com.android.inputmethod.latin.NativeSuggestOptions when you add, remove or
4550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // reorder options.
4650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int IS_GESTURE = 0;
4750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int USE_FULL_EDIT_DISTANCE = 1;
48338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // Additional features options are stored after the other options and used as setting values of
49338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // experimental features.
50338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    static const int ADDITIONAL_FEATURES_OPTIONS = 2;
5150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int *const mOptions;
5350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int mLength;
5450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool isValidKey(const int key) const {
5650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0 <= key && key < mLength;
5750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
5850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool getBoolOption(const int key) const {
6050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
6150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key] != 0;
6250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
6350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return false;
6450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
6550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
6650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE int getIntOption(const int key) const {
6750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
6850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key];
6950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
7050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0;
7150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
7250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi};
7350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi} // namespace latinime
7450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#endif // LATINIME_SUGGEST_OPTIONS_H
75