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