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
3759ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi    AK_FORCE_INLINE bool blockOffensiveWords() const {
3859ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi        return getBoolOption(BLOCK_OFFENSIVE_WORDS);
3959ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi    }
4059ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi
41b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi    AK_FORCE_INLINE bool enableSpaceAwareGesture() const {
42b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi        return getBoolOption(SPACE_AWARE_GESTURE_ENABLED);
43b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi    }
44b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi
45338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    AK_FORCE_INLINE bool getAdditionalFeaturesBoolOption(const int key) const {
46338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi        return getBoolOption(key + ADDITIONAL_FEATURES_OPTIONS);
47338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    }
4850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
4950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi private:
5029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa    DISALLOW_IMPLICIT_CONSTRUCTORS(SuggestOptions);
5129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa
5250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // Need to update com.android.inputmethod.latin.NativeSuggestOptions when you add, remove or
5350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    // reorder options.
5450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int IS_GESTURE = 0;
5550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    static const int USE_FULL_EDIT_DISTANCE = 1;
5659ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi    static const int BLOCK_OFFENSIVE_WORDS = 2;
57b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi    static const int SPACE_AWARE_GESTURE_ENABLED = 3;
58338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // Additional features options are stored after the other options and used as setting values of
59338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi    // experimental features.
60b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi    static const int ADDITIONAL_FEATURES_OPTIONS = 4;
6150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
6250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int *const mOptions;
6350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    const int mLength;
6450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
6550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool isValidKey(const int key) const {
6650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0 <= key && key < mLength;
6750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
6850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
6950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE bool getBoolOption(const int key) const {
7050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
7150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key] != 0;
7250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
7350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return false;
7450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
7550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi
7650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    AK_FORCE_INLINE int getIntOption(const int key) const {
7750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        if (isValidKey(key)) {
7850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi            return mOptions[key];
7950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        }
8050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi        return 0;
8150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi    }
8250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi};
8350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi} // namespace latinime
8450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#endif // LATINIME_SUGGEST_OPTIONS_H
85