17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifndef PINYINIME_INCLUDE_SPELLINGTABLE_H__
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define PINYINIME_INCLUDE_SPELLINGTABLE_H__
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <stdlib.h>
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./dictdef.h"
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectnamespace ime_pinyin {
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___BUILD_MODEL___
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectconst size_t kMaxSpellingSize = kMaxPinyinSize;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projecttypedef struct {
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  char str[kMaxSpellingSize + 1];
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  double freq;
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} RawSpelling, *PRawSpelling;
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// This class is used to store the spelling strings
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// The length of the input spelling string should be less or equal to the
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// spelling_size_ (set by init_table). If the input string is too long,
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// we only keep its first spelling_size_ chars.
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectclass SpellingTable {
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private:
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  static const size_t kNotSupportNum = 3;
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  static const char kNotSupportList[kNotSupportNum][kMaxSpellingSize + 1];
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool need_score_;
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t spelling_max_num_;
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  RawSpelling *raw_spellings_;
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Used to store spelling strings. If the spelling table needs to calculate
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // score, an extra char after each spelling string is the score.
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // An item with a lower score has a higher probability.
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  char *spelling_buf_;
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t spelling_size_;
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  double total_freq_;
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t spelling_num_;
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  double score_amplifier_;
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  unsigned char average_score_;
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // If frozen is true, put_spelling() and contain() are not allowed to call.
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool frozen_;
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t get_hash_pos(const char* spelling_str);
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t hash_pos_next(size_t hash_pos);
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void free_resource();
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public:
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  SpellingTable();
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  ~SpellingTable();
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // pure_spl_size is the pure maximum spelling string size. For example,
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // "zhuang" is the longgest item in Pinyin, so pure_spl_size should be 6.
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // spl_max_num is the maximum number of spelling strings to store.
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // need_score is used to indicate whether the caller needs to calculate a
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // score for each spelling.
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool init_table(size_t pure_spl_size, size_t spl_max_num, bool need_score);
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Put a spelling string to the table.
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // It always returns false if called after arrange() withtout a new
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // init_table() operation.
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // freq is the spelling's occuring count.
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // If the spelling has been in the table, occuring count will accumulated.
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool put_spelling(const char* spelling_str, double spl_count);
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Test whether a spelling string is in the table.
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // It always returns false, when being called after arrange() withtout a new
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // init_table() operation.
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool contain(const char* spelling_str);
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Sort the spelling strings and put them from the begin of the buffer.
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Return the pointer of the sorted spelling strings.
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // item_size and spl_num return the item size and number of spelling.
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Because each spelling uses a '\0' as terminator, the returned item_size is
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // at least one char longer than the spl_size parameter specified by
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // init_table(). If the table is initialized to calculate score, item_size
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // will be increased by 1, and current_spl_str[item_size - 1] stores an
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // unsinged char score.
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // An item with a lower score has a higher probability.
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Do not call put_spelling() and contains() after arrange().
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  const char* arrange(size_t *item_size, size_t *spl_num);
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  float get_score_amplifier();
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  unsigned char get_average_score();
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project};
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif  // ___BUILD_MODEL___
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif  // PINYINIME_INCLUDE_SPELLINGTABLE_H__
112