/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LATINIME_DIC_NODE_PROFILER_H
#define LATINIME_DIC_NODE_PROFILER_H

#include "defines.h"

#if DEBUG_DICT
#define PROF_SPACE_SUBSTITUTION(profiler) profiler.profSpaceSubstitution()
#define PROF_SPACE_OMISSION(profiler) profiler.profSpaceOmission()
#define PROF_ADDITIONAL_PROXIMITY(profiler) profiler.profAdditionalProximity()
#define PROF_SUBSTITUTION(profiler) profiler.profSubstitution()
#define PROF_OMISSION(profiler) profiler.profOmission()
#define PROF_INSERTION(profiler) profiler.profInsertion()
#define PROF_MATCH(profiler) profiler.profMatch()
#define PROF_COMPLETION(profiler) profiler.profCompletion()
#define PROF_TRANSPOSITION(profiler) profiler.profTransposition()
#define PROF_NEARESTKEY(profiler) profiler.profNearestKey()
#define PROF_TERMINAL(profiler) profiler.profTerminal()
#define PROF_NEW_WORD(profiler) profiler.profNewWord()
#define PROF_NEW_WORD_BIGRAM(profiler) profiler.profNewWordBigram()
#define PROF_NODE_RESET(profiler) profiler.reset()
#define PROF_NODE_COPY(src, dest) dest.copy(src)
#else
#define PROF_SPACE_SUBSTITUTION(profiler)
#define PROF_SPACE_OMISSION(profiler)
#define PROF_ADDITONAL_PROXIMITY(profiler)
#define PROF_SUBSTITUTION(profiler)
#define PROF_OMISSION(profiler)
#define PROF_INSERTION(profiler)
#define PROF_MATCH(profiler)
#define PROF_COMPLETION(profiler)
#define PROF_TRANSPOSITION(profiler)
#define PROF_NEARESTKEY(profiler)
#define PROF_TERMINAL(profiler)
#define PROF_NEW_WORD(profiler)
#define PROF_NEW_WORD_BIGRAM(profiler)
#define PROF_NODE_RESET(profiler)
#define PROF_NODE_COPY(src, dest)
#endif

namespace latinime {

class DicNodeProfiler {
 public:
#if DEBUG_DICT
    AK_FORCE_INLINE DicNodeProfiler()
            : mProfOmission(0), mProfInsertion(0), mProfTransposition(0),
              mProfAdditionalProximity(0), mProfSubstitution(0),
              mProfSpaceSubstitution(0), mProfSpaceOmission(0),
              mProfMatch(0), mProfCompletion(0), mProfTerminal(0),
              mProfNearestKey(0), mProfNewWord(0), mProfNewWordBigram(0) {}

    int mProfOmission;
    int mProfInsertion;
    int mProfTransposition;
    int mProfAdditionalProximity;
    int mProfSubstitution;
    int mProfSpaceSubstitution;
    int mProfSpaceOmission;
    int mProfMatch;
    int mProfCompletion;
    int mProfTerminal;
    int mProfNearestKey;
    int mProfNewWord;
    int mProfNewWordBigram;

    void profSpaceSubstitution() {
        ++mProfSpaceSubstitution;
    }

    void profSpaceOmission() {
        ++mProfSpaceOmission;
    }

    void profAdditionalProximity() {
        ++mProfAdditionalProximity;
    }

    void profSubstitution() {
        ++mProfSubstitution;
    }

    void profOmission() {
        ++mProfOmission;
    }

    void profInsertion() {
        ++mProfInsertion;
    }

    void profMatch() {
        ++mProfMatch;
    }

    void profCompletion() {
        ++mProfCompletion;
    }

    void profTransposition() {
        ++mProfTransposition;
    }

    void profNearestKey() {
        ++mProfNearestKey;
    }

    void profTerminal() {
        ++mProfTerminal;
    }

    void profNewWord() {
        ++mProfNewWord;
    }

    void profNewWordBigram() {
        ++mProfNewWordBigram;
    }

    void reset() {
        mProfSpaceSubstitution = 0;
        mProfSpaceOmission = 0;
        mProfAdditionalProximity = 0;
        mProfSubstitution = 0;
        mProfOmission = 0;
        mProfInsertion = 0;
        mProfMatch = 0;
        mProfCompletion = 0;
        mProfTransposition = 0;
        mProfNearestKey = 0;
        mProfTerminal = 0;
        mProfNewWord = 0;
        mProfNewWordBigram = 0;
    }

    void copy(const DicNodeProfiler *const profiler) {
        mProfSpaceSubstitution = profiler->mProfSpaceSubstitution;
        mProfSpaceOmission = profiler->mProfSpaceOmission;
        mProfAdditionalProximity = profiler->mProfAdditionalProximity;
        mProfSubstitution = profiler->mProfSubstitution;
        mProfOmission = profiler->mProfOmission;
        mProfInsertion = profiler->mProfInsertion;
        mProfMatch = profiler->mProfMatch;
        mProfCompletion = profiler->mProfCompletion;
        mProfTransposition = profiler->mProfTransposition;
        mProfNearestKey = profiler->mProfNearestKey;
        mProfTerminal = profiler->mProfTerminal;
        mProfNewWord = profiler->mProfNewWord;
        mProfNewWordBigram = profiler->mProfNewWordBigram;
    }

    void dump() const {
        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",
                mProfOmission, mProfInsertion, mProfTransposition, mProfAdditionalProximity,
                mProfSubstitution, mProfSpaceSubstitution, mProfSpaceOmission, mProfMatch,
                mProfCompletion, mProfTerminal, mProfNewWord, mProfNewWordBigram);
    }
#else
    DicNodeProfiler() {}
#endif
 private:
    // Caution!!!
    // Use a default copy constructor and an assign operator because shallow copies are ok
    // for this class
};
}
#endif // LATINIME_DIC_NODE_PROFILER_H
