1668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi/*
2668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * Copyright (C) 2013 The Android Open Source Project
3668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi *
4668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
5668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
6668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * You may obtain a copy of the License at
7668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi *
8668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
9668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi *
10668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
11668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
12668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * See the License for the specific language governing permissions and
14668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi * limitations under the License.
15668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi */
16668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
17668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi#ifndef LATINIME_BIGRAM_LIST_POLICY_H
18668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi#define LATINIME_BIGRAM_LIST_POLICY_H
19668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
20cafab169cdb21244c82b99c09983c98066113d87Ken Wakasa#include <cstdint>
21668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
22668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi#include "defines.h"
2388bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/interface/dictionary_bigrams_structure_policy.h"
2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/bigram/bigram_list_read_write_utils.h"
25d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi#include "utils/byte_array_view.h"
26668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
27668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanaginamespace latinime {
28668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
29668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagiclass BigramListPolicy : public DictionaryBigramsStructurePolicy {
30668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi public:
31d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi    BigramListPolicy(const ReadOnlyByteArrayView buffer) : mBuffer(buffer) {}
32668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
33668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi    ~BigramListPolicy() {}
34668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
35668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi    void getNextBigram(int *const outBigramPos, int *const outProbability, bool *const outHasNext,
36668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi            int *const pos) const {
3777ef75cbe6722d1eb45115c1ad82f963444d71cdKeisuke Kuroyanagi        BigramListReadWriteUtils::BigramFlags flags;
38d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi        if (!BigramListReadWriteUtils::getBigramEntryPropertiesAndAdvancePosition(mBuffer, &flags,
39d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi                outBigramPos, pos)) {
40d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi            AKLOGE("Cannot read bigram entry. bufSize: %zd, pos: %d. ", mBuffer.size(), *pos);
413225b6fe66a84ed7f499daf84d085141a66bb346Keisuke Kuroyanagi            *outProbability = NOT_A_PROBABILITY;
423225b6fe66a84ed7f499daf84d085141a66bb346Keisuke Kuroyanagi            *outHasNext = false;
433225b6fe66a84ed7f499daf84d085141a66bb346Keisuke Kuroyanagi            return;
443225b6fe66a84ed7f499daf84d085141a66bb346Keisuke Kuroyanagi        }
45202e416b51ef4cf3553afeb305ca4b14dd6105e5Keisuke Kuroyanagi        *outProbability = BigramListReadWriteUtils::getProbabilityFromFlags(flags);
46202e416b51ef4cf3553afeb305ca4b14dd6105e5Keisuke Kuroyanagi        *outHasNext = BigramListReadWriteUtils::hasNext(flags);
47668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi    }
48668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
493225b6fe66a84ed7f499daf84d085141a66bb346Keisuke Kuroyanagi    bool skipAllBigrams(int *const pos) const {
50d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi        return BigramListReadWriteUtils::skipExistingBigrams(mBuffer, pos);
51668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi    }
52668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
53668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi private:
54668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi    DISALLOW_IMPLICIT_CONSTRUCTORS(BigramListPolicy);
55668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi
56d01eb3c94c29d2fe0a9974c0dc7e3cfe5d26032bKeisuke Kuroyanagi    const ReadOnlyByteArrayView mBuffer;
57668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi};
58668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi} // namespace latinime
59668870be431d17ee4ceb5ce161aee1189063af18Keisuke Kuroyanagi#endif // LATINIME_BIGRAM_LIST_POLICY_H
60