suggest_options.h revision 338ef65077f43d6a35665a5c8eb6a44928332547
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:
4250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // Need to update com.android.inputmethod.latin.NativeSuggestOptions when you add, remove or
4350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // reorder options.
4450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int IS_GESTURE = 0;
4550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int USE_FULL_EDIT_DISTANCE = 1;
46338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // Additional features options are stored after the other options and used as setting values of
47338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // experimental features.
48338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    static const int ADDITIONAL_FEATURES_OPTIONS = 2;
4950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int *const mOptions;
5150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int mLength;
5250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool isValidKey(const int key) const {
5450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0 <= key && key < mLength;
5550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
5650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
5750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool getBoolOption(const int key) const {
5850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
5950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key] != 0;
6050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
6150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return false;
6250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
6350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
6450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE int getIntOption(const int key) const {
6550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
6650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key];
6750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
6850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0;
6950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
7050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi};
7150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi} // namespace latinime
7250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#endif // LATINIME_SUGGEST_OPTIONS_H
73