12fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* 22fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Copyright (C) 2013, The Android Open Source Project 32fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 42fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Licensed under the Apache License, Version 2.0 (the "License"); 52fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * you may not use this file except in compliance with the License. 62fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * You may obtain a copy of the License at 72fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 82fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * http://www.apache.org/licenses/LICENSE-2.0 92fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * 102fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Unless required by applicable law or agreed to in writing, software 112fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * distributed under the License is distributed on an "AS IS" BASIS, 122fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * See the License for the specific language governing permissions and 142fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * limitations under the License. 152fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa */ 162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#ifndef LATINIME_SHORTCUT_DICT_CONTENT_H 182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#define LATINIME_SHORTCUT_DICT_CONTENT_H 192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 202ac934296c0571ea252f3fb5a23fba29eb89c666Keisuke Kuroyanagi#include <cstdio> 212ac934296c0571ea252f3fb5a23fba29eb89c666Keisuke Kuroyanagi 222fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "defines.h" 2388bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v4/content/sparse_table_dict_content.h" 2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v4/content/terminal_position_lookup_table.h" 2588bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v4/ver4_dict_constants.h" 262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 272fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasanamespace latinime { 282fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 291f6e52ef029e7807b6998d397556fac30b2b7ff4Keisuke Kuroyanagiclass ReadWriteByteArrayView; 301f6e52ef029e7807b6998d397556fac30b2b7ff4Keisuke Kuroyanagi 312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasaclass ShortcutDictContent : public SparseTableDictContent { 322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa public: 331f6e52ef029e7807b6998d397556fac30b2b7ff4Keisuke Kuroyanagi ShortcutDictContent(const ReadWriteByteArrayView *const buffers) 341f6e52ef029e7807b6998d397556fac30b2b7ff4Keisuke Kuroyanagi : SparseTableDictContent(buffers, Ver4DictConstants::SHORTCUT_ADDRESS_TABLE_BLOCK_SIZE, 352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa Ver4DictConstants::SHORTCUT_ADDRESS_TABLE_DATA_SIZE) {} 362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ShortcutDictContent() 382fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa : SparseTableDictContent(Ver4DictConstants::SHORTCUT_ADDRESS_TABLE_BLOCK_SIZE, 392fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa Ver4DictConstants::SHORTCUT_ADDRESS_TABLE_DATA_SIZE) {} 402fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 412fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa void getShortcutEntry(const int maxCodePointCount, int *const outCodePoint, 422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int *const outCodePointCount, int *const outProbability, bool *const outhasNext, 432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int shortcutEntryPos) { 442fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int readingPos = shortcutEntryPos; 452fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return getShortcutEntryAndAdvancePosition(maxCodePointCount, outCodePoint, 462fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa outCodePointCount, outProbability, outhasNext, &readingPos); 472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 482fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 492fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa void getShortcutEntryAndAdvancePosition(const int maxCodePointCount, 502fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int *const outCodePoint, int *const outCodePointCount, int *const outProbability, 512fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool *const outhasNext, int *const shortcutEntryPos) const; 522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 532fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Returns head position of shortcut list for a PtNode specified by terminalId. 542fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int getShortcutListHeadPos(const int terminalId) const; 552fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 562ac934296c0571ea252f3fb5a23fba29eb89c666Keisuke Kuroyanagi bool flushToFile(FILE *const file) const { 572ac934296c0571ea252f3fb5a23fba29eb89c666Keisuke Kuroyanagi return flush(file); 582ac934296c0571ea252f3fb5a23fba29eb89c666Keisuke Kuroyanagi } 592fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool runGC(const TerminalPositionLookupTable::TerminalIdMap *const terminalIdMap, 612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const ShortcutDictContent *const originalShortcutDictContent); 622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 632fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool createNewShortcutList(const int terminalId); 642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 652fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool copyShortcutList(const int shortcutListPos, const int toPos); 662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 672fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool setProbability(const int probability, const int shortcutEntryPos); 682fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool writeShortcutEntry(const int *const codePoint, const int codePointCount, 702fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int probability, const bool hasNext, const int shortcutEntryPos) { 712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int writingPos = shortcutEntryPos; 722fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return writeShortcutEntryAndAdvancePosition(codePoint, codePointCount, probability, 732fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa hasNext, &writingPos); 742fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 752fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 762fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool writeShortcutEntryAndAdvancePosition(const int *const codePoint, 772fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int codePointCount, const int probability, const bool hasNext, 782fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int *const shortcutEntryPos); 792fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int findShortcutEntryAndGetPos(const int shortcutListPos, 812fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int *const targetCodePointsToFind, const int codePointCount) const; 822fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa private: 842fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa DISALLOW_COPY_AND_ASSIGN(ShortcutDictContent); 852fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa bool copyShortcutListFromDictContent(const int shortcutListPos, 872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const ShortcutDictContent *const sourceShortcutDictContent, const int toPos); 882fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 892fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa int createAndGetShortcutFlags(const int probability, const bool hasNext) const; 902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}; 912fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} // namespace latinime 922fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#endif /* LATINIME_SHORTCUT_DICT_CONTENT_H */ 93