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