/*
*****************************************************************************************
*   Copyright (C) 1997-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
*****************************************************************************************
*
* File UNICDCM.CPP
*
* Modification History:
*
*   Date        Name        Description
*   02/18/97    aliu        Converted from OpenClass.
*   03/11/97    aliu        Recoded mappedChar() slightly to clean up code and improve
*                           performance.
*   04/15/97    aliu        Worked around bug in AIX xlC compiler which occurs if static
*                           arrays contain const elements.
*   05/06/97    aliu        Made SpecialMapping an array of objects instead of pointers,
*                           to help out non-compliant compilers.
*****************************************************************************************
*/

// *****************************************************************************
// This file was generated from the java source file UnicodeClassMapping.java
// *****************************************************************************

#include "unicdcm.h"
#include "unicode/unicode.h"

// *****************************************************************************
// class UnicodeClassMapping
// This class maps categories to state change inputs for the
// WordBreakTable.  An entire category is mapped to the same
// value unless the character in question appears in the exception list.
// *****************************************************************************

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

UnicodeClassMapping::UnicodeClassMapping(Type* mappedValue, 
                     int32_t mappedValue_length,
                                         const SpecialMapping* exceptionChars,
                                         int32_t exceptionChars_length,
                                         const UBool *hasException,
                                         Type* asciiValues)
:   fMappedValue(mappedValue),
    fMappedValue_length(mappedValue_length),
    fExceptionChars(exceptionChars),
    fExceptionChars_length(exceptionChars_length),
    fHasException(hasException),
    fAsciiValues(asciiValues)
{
}

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

TextBoundaryData::Type
UnicodeClassMapping::mappedChar(UChar ch) const
{
    if (ch <= 255) {
        return fAsciiValues[ ch ];
    }

    // get an appropriate category based on the character's Unicode class
    // if there's no entry in the exception table for that Unicode class,
    // we're done; otherwise we have to look in the exception table for
    // the character's category (\uffff is treated here as a sentinel
    // value meaning "end of the string"-- we always look in the exception
    // table for its category)
    Type chType = Unicode::getType(ch);
    if ((fExceptionChars_length == 0) ||
        (!fHasException[chType] && (ch != (UChar)0xFFFF)))
    {
        return fMappedValue[chType];
    }

    // The invariant during this loop is that the character ch is <= max and
    // >= min.  We iterate until min == max.
    int32_t min = 0;
    int32_t max = fExceptionChars_length - 1;
    while (max > min) {
        int32_t pos = (max + min) >> 1;
        if (ch > fExceptionChars[pos].fEndChar) {
            min = pos + 1; 
        }else{
            max = pos;
        }
    }
    const SpecialMapping* sm = &fExceptionChars[min];
    if (sm->fStartChar <= ch && ch <= sm->fEndChar)
        return sm->fNewValue;
    else
        return fMappedValue[chType];
}

//eof
