/*
*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright Taligent, Inc.,  1997                                                 *
*   (C) Copyright International Business Machines Corporation,  1997-1999                    *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.                  *
*   US Government Users Restricted Rights - Use, duplication, or disclosure             *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                              *
*                                                                                       *
*****************************************************************************************
*
* File WDBKTBL.H
*
* WordBreakTable implements a state transition table.
*
* @package  Text and International
* @category Text Scanning
*
* Modification History:
*
*   Date        Name        Description
*   02/18/97    aliu        Converted from OpenClass.  Made statics const.
*****************************************************************************************
*/

#ifndef WDBKTBL_H
#define WDBKTBL_H

#include "utypes.h"
#include "txtbdat.h"

/**
 * This class implements a state transition table.
 * After each transition, using the get method, the
 * new state is returned along with information about
 * the state change (ex. was it a "marked" transition").
 * For efficiency, none of the arguments to any of these
 * methods are validated.
 */
class WordBreakTable {
public:
    // For convenience
    typedef TextBoundaryData::Node Node;
    typedef TextBoundaryData::Type Type;

    /**
     * Construct a table from the provided data.  See CharacterBreakData or
     * the other TextBoundaryData subclasses for examples.  Each row represents
     * a state, each column within a row represents a transition.  The values
     * in the table represent the new state and mark information.
     * @param cols number of columns in the table (transitions)
     * @param data an encoded byte array containing state and transition data
     * @param data_length the length of the byte array data
     */
    WordBreakTable(int32_t cols, const Node data[], int32_t data_length);

    /**
     * Get the resulting state moving from oldState accepting input.
     * @param oldState current state
     * @param input input
     * @return resulting state and transition data
     */
    Node get(Node oldState, Type input) const;

    /**
     * Checks to see if the transition into the specified state was "marked."
     * @param state the state as returned by get, initialState, or endState
     * @return true if transition into state was marked.
     */
    bool_t isMarkState(Node state) const;

    /**
     * Check to see if the state is the end state
     * @param state the state to check
     * @return true if state is an end state
     */
    bool_t isEndState(Node state) const;

    /**
     * Get the initial state
     * @return the initial state
     */
    Node initialState(void) const;

private:
    static const Node  kMark_mask;
    static const Node  kIndex_mask;

    static const Node   kInitial_state;
    static const Node   kEnd_state;

    const TextBoundaryData::Node* fData;
    int32_t fData_length;
    int32_t fCols;
};

// -------------------------------------

inline WordBreakTable::Node
WordBreakTable::get(WordBreakTable::Node oldState, WordBreakTable::Type input) const
{
    return fData[(oldState & kIndex_mask) * fCols + input];
}

inline bool_t
WordBreakTable::isMarkState(WordBreakTable::Node state) const
{
    return (state & kMark_mask) != 0;
}

inline bool_t
WordBreakTable::isEndState(WordBreakTable::Node state) const
{
    return (state & kIndex_mask) == kEnd_state;
}

inline WordBreakTable::Node
WordBreakTable::initialState() const
{
    return kInitial_state;
}

#endif // _WDBKTBL
//eof
