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