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_PROFILER_H 18#define LATINIME_DIC_NODE_PROFILER_H 19 20#include "defines.h" 21 22#if DEBUG_DICT 23#define PROF_SPACE_SUBSTITUTION(profiler) profiler.profSpaceSubstitution() 24#define PROF_SPACE_OMISSION(profiler) profiler.profSpaceOmission() 25#define PROF_ADDITIONAL_PROXIMITY(profiler) profiler.profAdditionalProximity() 26#define PROF_SUBSTITUTION(profiler) profiler.profSubstitution() 27#define PROF_OMISSION(profiler) profiler.profOmission() 28#define PROF_INSERTION(profiler) profiler.profInsertion() 29#define PROF_MATCH(profiler) profiler.profMatch() 30#define PROF_COMPLETION(profiler) profiler.profCompletion() 31#define PROF_TRANSPOSITION(profiler) profiler.profTransposition() 32#define PROF_NEARESTKEY(profiler) profiler.profNearestKey() 33#define PROF_TERMINAL(profiler) profiler.profTerminal() 34#define PROF_TERMINAL_INSERTION(profiler) profiler.profTerminalInsertion() 35#define PROF_NEW_WORD(profiler) profiler.profNewWord() 36#define PROF_NEW_WORD_BIGRAM(profiler) profiler.profNewWordBigram() 37#define PROF_NODE_RESET(profiler) profiler.reset() 38#define PROF_NODE_COPY(src, dest) dest.copy(src) 39#else 40#define PROF_SPACE_SUBSTITUTION(profiler) 41#define PROF_SPACE_OMISSION(profiler) 42#define PROF_ADDITONAL_PROXIMITY(profiler) 43#define PROF_SUBSTITUTION(profiler) 44#define PROF_OMISSION(profiler) 45#define PROF_INSERTION(profiler) 46#define PROF_MATCH(profiler) 47#define PROF_COMPLETION(profiler) 48#define PROF_TRANSPOSITION(profiler) 49#define PROF_NEARESTKEY(profiler) 50#define PROF_TERMINAL(profiler) 51#define PROF_TERMINAL_INSERTION(profiler) 52#define PROF_NEW_WORD(profiler) 53#define PROF_NEW_WORD_BIGRAM(profiler) 54#define PROF_NODE_RESET(profiler) 55#define PROF_NODE_COPY(src, dest) 56#endif 57 58namespace latinime { 59 60class DicNodeProfiler { 61 public: 62#if DEBUG_DICT 63 AK_FORCE_INLINE DicNodeProfiler() 64 : mProfOmission(0), mProfInsertion(0), mProfTransposition(0), 65 mProfAdditionalProximity(0), mProfSubstitution(0), 66 mProfSpaceSubstitution(0), mProfSpaceOmission(0), 67 mProfMatch(0), mProfCompletion(0), mProfTerminal(0), mProfTerminalInsertion(0), 68 mProfNearestKey(0), mProfNewWord(0), mProfNewWordBigram(0) {} 69 70 int mProfOmission; 71 int mProfInsertion; 72 int mProfTransposition; 73 int mProfAdditionalProximity; 74 int mProfSubstitution; 75 int mProfSpaceSubstitution; 76 int mProfSpaceOmission; 77 int mProfMatch; 78 int mProfCompletion; 79 int mProfTerminal; 80 int mProfTerminalInsertion; 81 int mProfNearestKey; 82 int mProfNewWord; 83 int mProfNewWordBigram; 84 85 void profSpaceSubstitution() { 86 ++mProfSpaceSubstitution; 87 } 88 89 void profSpaceOmission() { 90 ++mProfSpaceOmission; 91 } 92 93 void profAdditionalProximity() { 94 ++mProfAdditionalProximity; 95 } 96 97 void profSubstitution() { 98 ++mProfSubstitution; 99 } 100 101 void profOmission() { 102 ++mProfOmission; 103 } 104 105 void profInsertion() { 106 ++mProfInsertion; 107 } 108 109 void profMatch() { 110 ++mProfMatch; 111 } 112 113 void profCompletion() { 114 ++mProfCompletion; 115 } 116 117 void profTransposition() { 118 ++mProfTransposition; 119 } 120 121 void profNearestKey() { 122 ++mProfNearestKey; 123 } 124 125 void profTerminal() { 126 ++mProfTerminal; 127 } 128 129 void profTerminalInsertion() { 130 ++mProfTerminalInsertion; 131 } 132 133 void profNewWord() { 134 ++mProfNewWord; 135 } 136 137 void profNewWordBigram() { 138 ++mProfNewWordBigram; 139 } 140 141 void reset() { 142 mProfSpaceSubstitution = 0; 143 mProfSpaceOmission = 0; 144 mProfAdditionalProximity = 0; 145 mProfSubstitution = 0; 146 mProfOmission = 0; 147 mProfInsertion = 0; 148 mProfMatch = 0; 149 mProfCompletion = 0; 150 mProfTransposition = 0; 151 mProfNearestKey = 0; 152 mProfTerminal = 0; 153 mProfNewWord = 0; 154 mProfNewWordBigram = 0; 155 } 156 157 void copy(const DicNodeProfiler *const profiler) { 158 mProfSpaceSubstitution = profiler->mProfSpaceSubstitution; 159 mProfSpaceOmission = profiler->mProfSpaceOmission; 160 mProfAdditionalProximity = profiler->mProfAdditionalProximity; 161 mProfSubstitution = profiler->mProfSubstitution; 162 mProfOmission = profiler->mProfOmission; 163 mProfInsertion = profiler->mProfInsertion; 164 mProfMatch = profiler->mProfMatch; 165 mProfCompletion = profiler->mProfCompletion; 166 mProfTransposition = profiler->mProfTransposition; 167 mProfNearestKey = profiler->mProfNearestKey; 168 mProfTerminal = profiler->mProfTerminal; 169 mProfNewWord = profiler->mProfNewWord; 170 mProfNewWordBigram = profiler->mProfNewWordBigram; 171 } 172 173 void dump() const { 174 AKLOGI("O %d, I %d, T %d, AP %d, S %d, SS %d, SO %d, M %d, C %d, TE %d, NW = %d, NWB = %d", 175 mProfOmission, mProfInsertion, mProfTransposition, mProfAdditionalProximity, 176 mProfSubstitution, mProfSpaceSubstitution, mProfSpaceOmission, mProfMatch, 177 mProfCompletion, mProfTerminal, mProfNewWord, mProfNewWordBigram); 178 } 179#else 180 DicNodeProfiler() {} 181#endif 182 private: 183 // Caution!!! 184 // Use a default copy constructor and an assign operator because shallow copies are ok 185 // for this class 186}; 187} 188#endif // LATINIME_DIC_NODE_PROFILER_H 189