12fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang/*
22fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * Copyright (C) 2013 The Android Open Source Project
32fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang *
42fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * Licensed under the Apache License, Version 2.0 (the "License");
52fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * you may not use this file except in compliance with the License.
62fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * You may obtain a copy of the License at
72fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang *
82fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang *      http://www.apache.org/licenses/LICENSE-2.0
92fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang *
102fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * Unless required by applicable law or agreed to in writing, software
112fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * distributed under the License is distributed on an "AS IS" BASIS,
122fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * See the License for the specific language governing permissions and
142fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang * limitations under the License.
152fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang */
162fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
172fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang#ifndef DIGRAPH_UTILS_H
182fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang#define DIGRAPH_UTILS_H
192fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
20a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa#include "defines.h"
21a65c267b1f1207e54c6f821148c600e3899b7f9cKen Wakasa
222fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyangnamespace latinime {
232fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
2476e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiclass DictionaryHeaderStructurePolicy;
25bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
262fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyangclass DigraphUtils {
272fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang public:
282fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang    typedef enum {
292fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang        NOT_A_DIGRAPH_INDEX,
302fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang        FIRST_DIGRAPH_CODEPOINT,
312fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang        SECOND_DIGRAPH_CODEPOINT
322fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang    } DigraphCodePointIndex;
332fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
3425e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    typedef enum {
3525e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang        DIGRAPH_TYPE_NONE,
3625e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang        DIGRAPH_TYPE_GERMAN_UMLAUT,
3725e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    } DigraphType;
3825e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang
392fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang    typedef struct { int first; int second; int compositeGlyph; } digraph_t;
402fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
4176e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    static bool hasDigraphForCodePoint(const DictionaryHeaderStructurePolicy *const headerPolicy,
4276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi            const int compositeGlyphCodePoint);
4325e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    static int getDigraphCodePointForIndex(const int compositeGlyphCodePoint,
4425e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang            const DigraphCodePointIndex digraphCodePointIndex);
452fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
462fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang private:
472fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang    DISALLOW_IMPLICIT_CONSTRUCTORS(DigraphUtils);
4876e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    static DigraphType getDigraphTypeForDictionary(
4976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi            const DictionaryHeaderStructurePolicy *const headerPolicy);
5025e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    static int getAllDigraphsForDigraphTypeAndReturnSize(
5125e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang            const DigraphType digraphType, const digraph_t **const digraphs);
5225e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    static const digraph_t *getDigraphForCodePoint(const int compositeGlyphCodePoint);
5325e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    static const digraph_t *getDigraphForDigraphTypeAndCodePoint(
5425e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang            const DigraphType digraphType, const int compositeGlyphCodePoint);
552fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang
562fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang    static const digraph_t GERMAN_UMLAUT_DIGRAPHS[];
5725e8eda9afb5c36703bd50b263ab0dd3a3b38d31Tom Ouyang    static const DigraphType USED_DIGRAPH_TYPES[];
582fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang};
592fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang} // namespace latinime
602fdf5b70adab1cd7eaa62319524e6c79f2cbd14bTom Ouyang#endif // DIGRAPH_UTILS_H
61