Home | History | Annotate | Download | only in internal
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef LATINIME_DIC_NODE_PROPERTIES_H
     18 #define LATINIME_DIC_NODE_PROPERTIES_H
     19 
     20 #include <cstdint>
     21 #include <cstdlib>
     22 
     23 #include "defines.h"
     24 #include "utils/int_array_view.h"
     25 
     26 namespace latinime {
     27 
     28 /**
     29  * PtNode information related to the DicNode from the lexicon trie.
     30  */
     31 class DicNodeProperties {
     32  public:
     33     AK_FORCE_INLINE DicNodeProperties()
     34             : mChildrenPtNodeArrayPos(NOT_A_DICT_POS), mDicNodeCodePoint(NOT_A_CODE_POINT),
     35               mWordId(NOT_A_WORD_ID), mDepth(0), mLeavingDepth(0), mPrevWordCount(0) {}
     36 
     37     ~DicNodeProperties() {}
     38 
     39     // Should be called only once per DicNode is initialized.
     40     void init(const int childrenPos, const int nodeCodePoint, const int wordId,
     41             const uint16_t depth, const uint16_t leavingDepth, const WordIdArrayView prevWordIds) {
     42         mChildrenPtNodeArrayPos = childrenPos;
     43         mDicNodeCodePoint = nodeCodePoint;
     44         mWordId = wordId;
     45         mDepth = depth;
     46         mLeavingDepth = leavingDepth;
     47         prevWordIds.copyToArray(&mPrevWordIds, 0 /* offset */);
     48         mPrevWordCount = prevWordIds.size();
     49     }
     50 
     51     // Init for root with prevWordsPtNodePos which is used for n-gram
     52     void init(const int rootPtNodeArrayPos, const WordIdArrayView prevWordIds) {
     53         mChildrenPtNodeArrayPos = rootPtNodeArrayPos;
     54         mDicNodeCodePoint = NOT_A_CODE_POINT;
     55         mWordId = NOT_A_WORD_ID;
     56         mDepth = 0;
     57         mLeavingDepth = 0;
     58         prevWordIds.copyToArray(&mPrevWordIds, 0 /* offset */);
     59         mPrevWordCount = prevWordIds.size();
     60     }
     61 
     62     void initByCopy(const DicNodeProperties *const dicNodeProp) {
     63         mChildrenPtNodeArrayPos = dicNodeProp->mChildrenPtNodeArrayPos;
     64         mDicNodeCodePoint = dicNodeProp->mDicNodeCodePoint;
     65         mWordId = dicNodeProp->mWordId;
     66         mDepth = dicNodeProp->mDepth;
     67         mLeavingDepth = dicNodeProp->mLeavingDepth;
     68         const WordIdArrayView prevWordIdArrayView = dicNodeProp->getPrevWordIds();
     69         prevWordIdArrayView.copyToArray(&mPrevWordIds, 0 /* offset */);
     70         mPrevWordCount = prevWordIdArrayView.size();
     71     }
     72 
     73     // Init as passing child
     74     void init(const DicNodeProperties *const dicNodeProp, const int codePoint) {
     75         mChildrenPtNodeArrayPos = dicNodeProp->mChildrenPtNodeArrayPos;
     76         mDicNodeCodePoint = codePoint; // Overwrite the node char of a passing child
     77         mWordId = dicNodeProp->mWordId;
     78         mDepth = dicNodeProp->mDepth + 1; // Increment the depth of a passing child
     79         mLeavingDepth = dicNodeProp->mLeavingDepth;
     80         const WordIdArrayView prevWordIdArrayView = dicNodeProp->getPrevWordIds();
     81         prevWordIdArrayView.copyToArray(&mPrevWordIds, 0 /* offset */);
     82         mPrevWordCount = prevWordIdArrayView.size();
     83     }
     84 
     85     int getChildrenPtNodeArrayPos() const {
     86         return mChildrenPtNodeArrayPos;
     87     }
     88 
     89     int getDicNodeCodePoint() const {
     90         return mDicNodeCodePoint;
     91     }
     92 
     93     uint16_t getDepth() const {
     94         return mDepth;
     95     }
     96 
     97     // TODO: Move to output?
     98     uint16_t getLeavingDepth() const {
     99         return mLeavingDepth;
    100     }
    101 
    102     bool isTerminal() const {
    103         return mWordId != NOT_A_WORD_ID;
    104     }
    105 
    106     bool hasChildren() const {
    107         return (mChildrenPtNodeArrayPos != NOT_A_DICT_POS) || mDepth != mLeavingDepth;
    108     }
    109 
    110     const WordIdArrayView getPrevWordIds() const {
    111         return WordIdArrayView::fromArray(mPrevWordIds).limit(mPrevWordCount);
    112     }
    113 
    114     int getWordId() const {
    115         return mWordId;
    116     }
    117 
    118  private:
    119     // Caution!!!
    120     // Use a default copy constructor and an assign operator because shallow copies are ok
    121     // for this class
    122     int mChildrenPtNodeArrayPos;
    123     int mDicNodeCodePoint;
    124     int mWordId;
    125     uint16_t mDepth;
    126     uint16_t mLeavingDepth;
    127     WordIdArray<MAX_PREV_WORD_COUNT_FOR_N_GRAM> mPrevWordIds;
    128     size_t mPrevWordCount;
    129 };
    130 } // namespace latinime
    131 #endif // LATINIME_DIC_NODE_PROPERTIES_H
    132