/*
*******************************************************************************
*
*   Copyright (C) 1997-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*/
/*===============================================================================
 *
 * File cmpshrta.cpp
 *
 * Modification History:
 *
 *  Date        Name        Description
 *  2/5/97      aliu        Added CompactIntArray streamIn and streamOut methods.
 *  3/4/97      aliu        Tuned performance of CompactIntArray constructor,
 * 05/07/97     helena      Added isBogus()
 *                          based on performance data indicating that this_obj was slow.
 * 07/15/98     erm         Synched with Java 1.2 CompactShortArray.java.
 * 07/30/98     erm         Added changes from 07/29/98 code review.
 * 11/01/99     weiv        Added getArray, getIndex and getCount based on Jitterbug 4
 *===============================================================================
 */
#include "ucmp16.h"
#include "cmemory.h"





#define arrayRegionMatches(source, sourceStart, target, targetStart, len) (uprv_memcmp(&source[sourceStart], &target[targetStart], len * sizeof(int16_t)) != 0)

static const int32_t UCMP16_kMaxUnicode = UCMP16_kMaxUnicode_int;
static const int32_t UCMP16_kUnicodeCount = UCMP16_kUnicodeCount_int;
static const int32_t UCMP16_kBlockShift = UCMP16_kBlockShift_int;
static const int32_t UCMP16_kBlockCount = UCMP16_kBlockCount_int;
static const int32_t UCMP16_kBlockBytes = UCMP16_kBlockBytes_int;
static const int32_t UCMP16_kIndexShift = UCMP16_kIndexShift_int;
static const int32_t UCMP16_kIndexCount = UCMP16_kIndexCount_int;
static const uint32_t UCMP16_kBlockMask = UCMP16_kBlockMask_int;

/**
 * Sets the array to the invalid memory state.
 */
static CompactShortArray* setToBogus(CompactShortArray* array);
static void touchBlock(CompactShortArray* this_obj,
               int32_t i,
               int16_t value);
static UBool blockTouched(const CompactShortArray* this_obj,
               int32_t i);


/* debug flags*/
/*=======================================================*/

int32_t ucmp16_getkUnicodeCount()
{return UCMP16_kUnicodeCount;}

int32_t ucmp16_getkBlockCount()
{return UCMP16_kBlockCount;}

CompactShortArray* ucmp16_open(int16_t defaultValue)
{
    int32_t i;
    CompactShortArray* this_obj = (CompactShortArray*) uprv_malloc(sizeof(CompactShortArray));
    if (this_obj == NULL)
        return NULL;

    this_obj->fArray = (int16_t*)uprv_malloc(UCMP16_kUnicodeCount * sizeof(int16_t));
    if (this_obj->fArray == NULL)
    {
        uprv_free(this_obj);
        return NULL;
    }

    this_obj->fIndex = (uint16_t*)uprv_malloc(UCMP16_kIndexCount * sizeof(uint16_t));
    if (this_obj->fIndex == NULL)
    {
        uprv_free(this_obj->fArray);
        uprv_free(this_obj);
        return NULL;
    }

    this_obj->fHashes =(int32_t*)uprv_malloc(UCMP16_kIndexCount * sizeof(int32_t));
    if (this_obj->fHashes == NULL)
    {
        uprv_free(this_obj->fArray);
        uprv_free(this_obj->fIndex);
        uprv_free(this_obj);
        return NULL;
    }

    this_obj->fStructSize = sizeof(CompactShortArray);
    this_obj->fCount = UCMP16_kUnicodeCount;
    this_obj->fCompact = FALSE; 
    this_obj->fBogus = FALSE;
    this_obj->fAlias = FALSE;
    this_obj->fIAmOwned = FALSE;
    this_obj->fDefaultValue = defaultValue;
    this_obj->kBlockShift = UCMP16_kBlockShift;
    this_obj->kBlockMask = UCMP16_kBlockMask;

    for (i = 0; i < UCMP16_kUnicodeCount; i += 1)
    {
      this_obj->fArray[i] = defaultValue;
    }

    for (i = 0; i < UCMP16_kIndexCount; i += 1)
    {
        this_obj->fIndex[i] = (uint16_t)(i << UCMP16_kBlockShift);
        this_obj->fHashes[i] = 0;
    }

    return this_obj;
}

void ucmp16_initBogus(CompactShortArray *this_obj)
{
    if (this_obj == NULL)
        return;
    this_obj->fStructSize = sizeof(CompactShortArray);
    this_obj->fCount = UCMP16_kUnicodeCount;
    this_obj->fCompact = FALSE;
    this_obj->fBogus = TRUE;
    this_obj->fArray = NULL;
    this_obj->fAlias = FALSE;
    this_obj->fIndex = NULL;
    this_obj->fHashes = NULL;
    this_obj->fIAmOwned = TRUE;
    this_obj->fDefaultValue = 0;
}

void ucmp16_init(CompactShortArray *this_obj, int16_t defaultValue)
{
    int32_t i;

    if (this_obj == NULL)
        return;

    this_obj->fStructSize = sizeof(CompactShortArray);
    this_obj->fCount = UCMP16_kUnicodeCount;
    this_obj->fCompact = FALSE;
    this_obj->fBogus = FALSE;
    this_obj->fArray = NULL;
    this_obj->fAlias = FALSE;
    this_obj->fIndex = NULL;
    this_obj->fHashes = NULL;
    this_obj->fIAmOwned = TRUE;
    this_obj->fDefaultValue = defaultValue;

    this_obj->fArray = (int16_t*)uprv_malloc(UCMP16_kUnicodeCount * sizeof(int16_t));
    if (this_obj->fArray == NULL)
    {
        setToBogus(this_obj);
        return;
    }

    this_obj->fIndex = (uint16_t*)uprv_malloc(UCMP16_kIndexCount * sizeof(uint16_t));
    if (this_obj->fIndex == NULL)
    {
        setToBogus(this_obj);
        return;
    }

    this_obj->fHashes =(int32_t*)uprv_malloc(UCMP16_kIndexCount * sizeof(int32_t));
    if (this_obj->fHashes == NULL)
    {
        setToBogus(this_obj);
        return;
    }

    this_obj->kBlockShift = UCMP16_kBlockShift;
    this_obj->kBlockMask = UCMP16_kBlockMask;
    for (i = 0; i < UCMP16_kUnicodeCount; i += 1)
    {
        this_obj->fArray[i] = defaultValue;
    }

    for (i = 0; i < UCMP16_kIndexCount; i += 1)
    {
        this_obj->fIndex[i] = (uint16_t)(i << UCMP16_kBlockShift);
        this_obj->fHashes[i] = 0;
    }
}

CompactShortArray* ucmp16_openAdopt(uint16_t *indexArray,
                    int16_t *newValues, 
                    int32_t count,
                    int16_t defaultValue)
{
    CompactShortArray* this_obj = (CompactShortArray*) uprv_malloc(sizeof(CompactShortArray));
    if (this_obj == NULL)
        return NULL;

    ucmp16_initAdopt(this_obj, indexArray, newValues, count, defaultValue);
    this_obj->fIAmOwned = FALSE;
    return this_obj;
}

CompactShortArray* ucmp16_openAdoptWithBlockShift(uint16_t *indexArray,
                          int16_t *newValues,
                          int32_t count,
                          int16_t defaultValue,
                          int32_t blockShift)
{
    CompactShortArray* this_obj = ucmp16_openAdopt(indexArray,
                             newValues,
                             count,
                             defaultValue);
    if (this_obj) {
        this_obj->kBlockShift  = blockShift;
        this_obj->kBlockMask = (uint32_t) (((uint32_t)1 << (uint32_t)blockShift) - (uint32_t)1);
    }

    return this_obj;
}

CompactShortArray* ucmp16_openAlias(uint16_t *indexArray,
                    int16_t *newValues, 
                    int32_t count,
                    int16_t defaultValue)
{
    CompactShortArray* this_obj = (CompactShortArray*) uprv_malloc(sizeof(CompactShortArray));
    if (this_obj == NULL)
        return NULL;

    ucmp16_initAlias(this_obj, indexArray, newValues, count, defaultValue);
    this_obj->fIAmOwned = FALSE;
    return this_obj;
}

/*=======================================================*/

CompactShortArray* ucmp16_initAdopt(CompactShortArray *this_obj,
                    uint16_t *indexArray,
                    int16_t *newValues, 
                    int32_t count,
                    int16_t defaultValue)
{
    if (this_obj) {
        this_obj->fHashes = NULL;
        this_obj->fCount = count; 
        this_obj->fDefaultValue = defaultValue;
        this_obj->fBogus = FALSE;
        this_obj->fArray = newValues;
        this_obj->fIndex = indexArray;
        this_obj->fCompact = (UBool)(count < UCMP16_kUnicodeCount);
        this_obj->fStructSize = sizeof(CompactShortArray);
        this_obj->kBlockShift = UCMP16_kBlockShift;
        this_obj->kBlockMask = UCMP16_kBlockMask;
        this_obj->fAlias = FALSE;
        this_obj->fIAmOwned = TRUE;
    }

    return this_obj;
}

CompactShortArray* ucmp16_initAdoptWithBlockShift(CompactShortArray *this_obj,
                          uint16_t *indexArray,
                          int16_t *newValues,
                          int32_t count,
                          int16_t defaultValue,
                          int32_t blockShift)
{
    ucmp16_initAdopt(this_obj, indexArray, newValues, count, defaultValue);

    if (this_obj) {
        this_obj->kBlockShift  = blockShift;
        this_obj->kBlockMask = (uint32_t) (((uint32_t)1 << (uint32_t)blockShift) - (uint32_t)1);
    }

    return this_obj;
}


CompactShortArray* ucmp16_initAlias(CompactShortArray *this_obj,
                    uint16_t *indexArray,
                    int16_t *newValues, 
                    int32_t count,
                    int16_t defaultValue)
{
    if (this_obj) {
        this_obj->fHashes = NULL;
        this_obj->fCount = count; 
        this_obj->fDefaultValue = defaultValue;
        this_obj->fBogus = FALSE;
        this_obj->fArray = newValues;
        this_obj->fIndex = indexArray;
        this_obj->fCompact = (UBool)(count < UCMP16_kUnicodeCount);
        this_obj->fStructSize = sizeof(CompactShortArray);
        this_obj->kBlockShift = UCMP16_kBlockShift;
        this_obj->kBlockMask = UCMP16_kBlockMask;
        this_obj->fAlias = TRUE;
        this_obj->fIAmOwned = TRUE;
    }

    return this_obj;
}

CompactShortArray* ucmp16_initAliasWithBlockShift(CompactShortArray *this_obj,
                          uint16_t *indexArray,
                          int16_t *newValues,
                          int32_t count,
                          int16_t defaultValue,
                          int32_t blockShift)
{
    ucmp16_initAlias(this_obj, indexArray, newValues, count, defaultValue);

    if (this_obj) {
        this_obj->kBlockShift  = blockShift;
        this_obj->kBlockMask = (uint32_t) (((uint32_t)1 << (uint32_t)blockShift) - (uint32_t)1);
    }

    return this_obj;
}


/*=======================================================*/

void ucmp16_close(CompactShortArray* this_obj)
{
    if(this_obj != NULL) {
        setToBogus(this_obj);
        if(!this_obj->fIAmOwned)
        {
            uprv_free(this_obj);
        }
    }
}

static CompactShortArray* setToBogus(CompactShortArray* this_obj)
{
    if(this_obj != NULL) {
        if(!this_obj->fAlias) {
            if (this_obj->fArray != NULL) {
                uprv_free(this_obj->fArray);
                this_obj->fArray = NULL;
            }

            if (this_obj->fIndex != NULL) {
                uprv_free(this_obj->fIndex);
                this_obj->fIndex = NULL;
            }
        }
        if (this_obj->fHashes != NULL) {
            uprv_free(this_obj->fHashes);
            this_obj->fHashes = NULL;
        }

        this_obj->fCount = 0;
        this_obj->fCompact = FALSE;
        this_obj->fBogus = TRUE;
    }

    return this_obj;
}

UBool ucmp16_isBogus(const CompactShortArray* this_obj)
{
    return (UBool)(this_obj == NULL || this_obj->fBogus);
}

void ucmp16_expand(CompactShortArray* this_obj)
{
    if (this_obj->fCompact)
    {
        int32_t i;
        int16_t *tempArray = (int16_t*)uprv_malloc(UCMP16_kUnicodeCount * sizeof(int16_t));

        if (tempArray == NULL)
        {
            setToBogus(this_obj);
            return;
        }

        this_obj->fHashes =(int32_t*)uprv_malloc(UCMP16_kIndexCount * sizeof(int32_t));
        if (this_obj->fHashes == NULL)
        {
            setToBogus(this_obj);
            return;
        }

        for (i = 0; i < UCMP16_kUnicodeCount; i += 1)
        {
            tempArray[i] = ucmp16_get(this_obj, (UChar)i);  /* HSYS : How expand?*/
        }

        for (i = 0; i < (1 << (16 - this_obj->kBlockShift)); i += 1)
        {
            this_obj->fIndex[i] = (uint16_t)(i<<this_obj->kBlockShift);
        }

        uprv_free(this_obj->fArray);
        this_obj->fArray = tempArray;
        this_obj->fCompact = FALSE;

        /* Since we don't know if the fIndex is also an alias, we allow tempArray to leak. */
        /* this_obj->fAlias = FALSE; */
    }
}

void ucmp16_set(CompactShortArray* this_obj,
        UChar c,
        int16_t value)
{
    if (this_obj->fCompact)
    {
        ucmp16_expand(this_obj);
        if (this_obj->fBogus)
            return;
    }

    this_obj->fArray[(int32_t)c] = value;

    if (value != this_obj->fDefaultValue)
    {
        touchBlock(this_obj, c >> this_obj->kBlockShift, value);
    }
}


void ucmp16_setRange(CompactShortArray* this_obj, 
             UChar start,
             UChar end,
             int16_t value)
{
    int32_t i;
    if (this_obj->fCompact)
    {
        ucmp16_expand(this_obj);
        if (this_obj->fBogus)
            return;
    }
    if (value != this_obj->fDefaultValue)
    {
        for (i = start; i <= end; i += 1)
        {
            this_obj->fArray[i] = value;
            touchBlock(this_obj, i >> this_obj->kBlockShift, value);
        }
    }
    else
    {
        for (i = start; i <= end; i += 1)
            this_obj->fArray[i] = value;
    }
}


/*=======================================================*/
void ucmp16_compact(CompactShortArray* this_obj)
{
    if (!this_obj->fCompact)
    {
        int32_t limitCompacted = 0;
        int32_t i, iBlockStart;
        int16_t iUntouched = -1;

        for (i = 0, iBlockStart = 0; i < (1 << (16 - this_obj->kBlockShift)); i += 1, iBlockStart += (1 << this_obj->kBlockShift))
        {
            UBool touched = blockTouched(this_obj, i);

            this_obj->fIndex[i] = 0xFFFF;

            if (!touched && iUntouched != -1)
            {
                /* If no values in this_obj block were set, we can just set its
                 * index to be the same as some other block with no values
                 * set, assuming we've seen one yet.
                 */
                this_obj->fIndex[i] = iUntouched;
            }
            else
            {
                int32_t j, jBlockStart;

                for (j = 0, jBlockStart = 0;
                    j < limitCompacted;
                    j += 1, jBlockStart += (1 << this_obj->kBlockShift))
                {
                    if (this_obj->fHashes[i] == this_obj->fHashes[j] &&
                        arrayRegionMatches(this_obj->fArray,
                            iBlockStart,
                            this_obj->fArray, 
                            jBlockStart,
                            (1 << this_obj->kBlockShift)))
                    {
                        this_obj->fIndex[i] = (int16_t)jBlockStart;
                    }
                }

                /* TODO: verify this_obj is correct*/
                if (this_obj->fIndex[i] == 0xFFFF)
                {
                    /* we didn't match, so copy & update*/
                    uprv_memcpy(&(this_obj->fArray[jBlockStart]), 
                            &(this_obj->fArray[iBlockStart]),
                            (1 << this_obj->kBlockShift)*sizeof(int16_t));

                    this_obj->fIndex[i] = (int16_t)jBlockStart;
                    this_obj->fHashes[j] = this_obj->fHashes[i];
                    limitCompacted += 1;

                    if (!touched)
                    {
                        /* If this_obj is the first untouched block we've seen,*/
                        /* remember its index.*/
                        iUntouched = (int16_t)jBlockStart;
                    }
                }
            }
        }

        /* we are done compacting, so now make the array shorter*/
        /* TODO: uprv_realloc should be used instead.
           What if uprv_malloc returns NULL [grhoten] */
        {
            int32_t newSize = limitCompacted * (1 << this_obj->kBlockShift);
            int16_t *result = (int16_t*) uprv_malloc(sizeof(int16_t) * newSize);

            uprv_memcpy(result, this_obj->fArray, newSize * sizeof(int16_t));

            uprv_free(this_obj->fArray);
            this_obj->fArray = result;
            this_obj->fCount = newSize;
            uprv_free(this_obj->fHashes);
            this_obj->fHashes = NULL;

            this_obj->fCompact = TRUE;
        }
    }
}

/**
 * Query whether a specified block was "touched", i.e. had a value set.
 * Untouched blocks can be skipped when compacting the array
 */

int16_t ucmp16_getDefaultValue(const CompactShortArray* this_obj)
{
    return this_obj->fDefaultValue;
}


static void touchBlock(CompactShortArray* this_obj,
        int32_t i,
        int16_t value)
{
    this_obj->fHashes[i] = (this_obj->fHashes[i] + (value << 1)) | 1;
}

static UBool blockTouched(const CompactShortArray* this_obj, int32_t i)
{
    return (UBool)(this_obj->fHashes[i] != 0);
}

uint32_t ucmp16_getCount(const CompactShortArray* this_obj)
{
    return this_obj->fCount;
}

const int16_t* ucmp16_getArray(const CompactShortArray* this_obj)
{
    return this_obj->fArray;
}

const uint16_t* ucmp16_getIndex(const CompactShortArray* this_obj)
{
    return this_obj->fIndex;
}

U_CAPI  uint32_t U_EXPORT2 ucmp16_flattenMem (const CompactShortArray* array, UMemoryStream *MS)
{
    int32_t size = 0;

    uprv_mstrm_write32(MS, ICU_UCMP16_VERSION);
    size += 4;

    uprv_mstrm_write32(MS, array->fCount);
    size += 4;

    uprv_mstrm_write32(MS, array->kBlockShift);
    size += 4;

    uprv_mstrm_write32(MS, array->kBlockMask);
    size += 4;

    uprv_mstrm_writeBlock(MS, array->fIndex, sizeof(array->fIndex[0])*UCMP16_kIndexCount);
    size += sizeof(array->fIndex[0])*UCMP16_kIndexCount;

    uprv_mstrm_writeBlock(MS, array->fArray, sizeof(array->fArray[0])*array->fCount);
    size += sizeof(array->fArray[0])*array->fCount;

    while(size%4) /* end padding */
    {
        uprv_mstrm_writePadding(MS, 1); /* Pad total so far to even size */
        size += 1;
    }

    return size;
}


/* We use sizeof(*array), etc so that this code can be as portable as 
   possible between the ucmpX_ family.  Check lines marked 'SIZE'.
*/

U_CAPI  void U_EXPORT2 ucmp16_initFromData(CompactShortArray *this_obj, const uint8_t **source, UErrorCode *status)
{
    uint32_t i;
    const uint8_t *oldSource = *source;

    if(U_FAILURE(*status))
        return;

    this_obj->fBogus = FALSE;
    this_obj->fStructSize = sizeof(CompactShortArray);
    this_obj->fCompact = TRUE;
    this_obj->fAlias = TRUE;
    this_obj->fIAmOwned = TRUE;
    this_obj->fHashes = NULL;
    this_obj->fDefaultValue = 0x0000; /* not used */

    i = * ((const uint32_t*) *source);
    (*source) += 4;

    if(i != ICU_UCMP16_VERSION)
    {
        this_obj->fArray = NULL;
        this_obj->fIndex = NULL;
        this_obj->fBogus = TRUE;
        this_obj->fCount = 0;
        *status = U_INVALID_FORMAT_ERROR;
        return;
    }

    this_obj->fCount = * ((const uint32_t*)*source);
    (*source) += 4;

    this_obj->kBlockShift = * ((const uint32_t*)*source);
    (*source) += 4;

    this_obj->kBlockMask = * ((const uint32_t*)*source);
    (*source) += 4;

    this_obj->fIndex = (uint16_t*) *source;
    (*source) += sizeof(this_obj->fIndex[0])*UCMP16_kIndexCount;

    this_obj->fArray = (int16_t*) *source;
    (*source) += sizeof(this_obj->fArray[0])*this_obj->fCount;

    /* eat up padding */
    while((*source-(oldSource))%4)
        (*source)++;
}


