/*
 * Copyright (C) 2013 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_TRAVERSAL_H
#define LATINIME_TRAVERSAL_H

#include "defines.h"

namespace latinime {

class DicTraverseSession;

class Traversal {
 public:
    virtual int getMaxPointerCount() const = 0;
    virtual bool allowsErrorCorrections(const DicNode *const dicNode) const = 0;
    virtual bool isOmission(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode, const DicNode *const childDicNode,
            const bool allowsErrorCorrections) const = 0;
    virtual bool isSpaceSubstitutionTerminal(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;
    virtual bool isSpaceOmissionTerminal(const DicTraverseSession *const traverseSession,
               const DicNode *const dicNode) const = 0;
    virtual bool shouldDepthLevelCache(const DicTraverseSession *const traverseSession) const = 0;
    virtual bool shouldNodeLevelCache(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;
    virtual bool canDoLookAheadCorrection(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;
    virtual ProximityType getProximityType(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode, const DicNode *const childDicNode) const = 0;
    virtual bool sameAsTyped(const DicTraverseSession *const traverseSession,
            const DicNode *const dicNode) const = 0;
    virtual bool needsToTraverseAllUserInput() const = 0;
    virtual float getMaxSpatialDistance() const = 0;
    virtual bool allowPartialCommit() const = 0;
    virtual int getDefaultExpandDicNodeSize() const = 0;
    virtual int getMaxCacheSize() const = 0;
    virtual bool isPossibleOmissionChildNode(const DicTraverseSession *const traverseSession,
            const DicNode *const parentDicNode, const DicNode *const dicNode) const = 0;
    virtual bool isGoodToTraverseNextWord(const DicNode *const dicNode) const = 0;

 protected:
    Traversal() {}
    virtual ~Traversal() {}

 private:
    DISALLOW_COPY_AND_ASSIGN(Traversal);
};
} // namespace latinime
#endif // LATINIME_TRAVERSAL_H
