/*
********************************************************************
*
*   Copyright (C) 1996-2000, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
********************************************************************
*/



#ifndef UCMP8_H
#define UCMP8_H


#include "unicode/utypes.h"

/*====================================*/
/* class CompactByteArray
 * Provides a compact way to store information that is indexed by Unicode values,
 * such as character properties, types, keyboard values, etc.
 * The ATypes are used by value, so should be small, integers or pointers.
 *====================================
 */

U_CAPI  const int32_t UCMP8_kUnicodeCount;
U_CAPI  const int32_t UCMP8_kBlockShift;
U_CAPI  const int32_t UCMP8_kBlockCount;
U_CAPI  const int32_t UCMP8_kIndexShift;
U_CAPI  const int32_t UCMP8_kIndexCount;
U_CAPI  const uint32_t UCMP8_kBlockMask;

U_CAPI int32_t ucmp8_getkUnicodeCount(void);
U_CAPI int32_t ucmp8_getkBlockCount(void);
U_CAPI int32_t ucmp8_getkIndexCount(void);
typedef struct{
  int8_t* fArray;
  uint16_t* fIndex;
  int32_t fCount;
  UBool fCompact;
  UBool fBogus;
} CompactByteArray;

U_CAPI  CompactByteArray* ucmp8_open(int8_t defaultValue);
U_CAPI  CompactByteArray* ucmp8_openAdopt(uint16_t* indexArray,
                               int8_t* newValues,
                               int32_t count);
U_CAPI  void ucmp8_close(CompactByteArray* array);
U_CAPI  UBool isBogus(const CompactByteArray* array);


U_CAPI int8_t ucmp8_get(CompactByteArray* array, uint16_t index);
U_CAPI uint8_t ucmp8_getu(CompactByteArray* array, uint16_t index);

U_CAPI  void ucmp8_set(CompactByteArray* array,
                 UChar index,
                 int8_t value);

U_CAPI  void ucmp8_setRange(CompactByteArray* array,
                  UChar start,
                  UChar end,
                  int8_t value);

U_CAPI  int32_t ucmp8_getCount(const CompactByteArray* array);
U_CAPI  const int8_t* ucmp8_getArray(const CompactByteArray* array);
U_CAPI  const uint16_t* ucmp8_getIndex(const CompactByteArray* array);

/* Compact the array.
   The value of cycle determines how large the overlap can be.
   A cycle of 1 is the most compacted, but takes the most time to do.
   If values stored in the array tend to repeat in cycles of, say, 16,
   then using that will be faster than cycle = 1, and get almost the
   same compression.
*/
U_CAPI  void ucmp8_compact(CompactByteArray* array,
                 uint32_t cycle);

/* Expanded takes the array back to a 65536 element array*/
U_CAPI  void ucmp8_expand(CompactByteArray* array);



#endif



