|  |  | 
|  | /* | 
|  | ******************************************************************** | 
|  | * COPYRIGHT: | 
|  | * (C) Copyright Taligent, Inc., 1996 | 
|  | * (C) Copyright International Business Machines Corporation, 1996 - 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. | 
|  | * | 
|  | ******************************************************************** | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * ========================================================================== | 
|  | * Copyright (c) 1995 Taligent, Inc. All Rights Reserved. | 
|  | * @version 1.0 23/10/96 | 
|  | * @author  Helena Shih | 
|  | * Based on Taligent international support for java | 
|  | * Modification History : | 
|  | * | 
|  | * 05/07/97     helena      Added isBogus() | 
|  | * 07/15/98        erm            Synched with Java 1.2 CompactShortArray.java. | 
|  | * 07/30/98        erm            Added 07/29/98 code review changes. | 
|  | * 04/21/99     Damiba     Port to C/New API faster ucmp16_get | 
|  | */ | 
|  |  | 
|  | #ifndef UCMP16_H | 
|  | #define UCMP16_H | 
|  |  | 
|  |  | 
|  | #include "utypes.h" | 
|  |  | 
|  |  | 
|  |  | 
|  | /** | 
|  | * class CompactATypeArray : use only on primitive data types | 
|  | * Provides a compact way to store information that is indexed by Unicode | 
|  | * values, such as character properties, types, keyboard values, etc.This | 
|  | * is very useful when you have a block of Unicode data that contains | 
|  | * significant values while the rest of the Unicode data is unused in the | 
|  | * application or when you have a lot of redundance, such as where all 21,000 | 
|  | * Han ideographs have the same value.  However, lookup is much faster than a | 
|  | * hash table. | 
|  | * <P> | 
|  | * A compact array of any primitive data type serves two purposes: | 
|  | * <UL type = round> | 
|  | *     <LI>Fast access of the indexed values. | 
|  | *     <LI>Smaller memory footprint. | 
|  | * </UL> | 
|  | * <P> | 
|  | * The index array always points into particular parts of the data array | 
|  | * it is initially set up to point at regular block boundaries | 
|  | * The following example uses blocks of 4 for simplicity | 
|  | * <PRE> | 
|  | * Example: Expanded | 
|  | * BLOCK  0   1   2   3   4 | 
|  | * INDEX  0   4   8   12  16 ... | 
|  | * ARRAY  abcdeababcdezyabcdea... | 
|  | *        |   |   |   |   |   |... | 
|  | * </PRE> | 
|  | * <P> | 
|  | * After compression, the index will point to various places in the data array | 
|  | * wherever there is a runs of the same elements as in the original | 
|  | * <PRE> | 
|  | * Example: Compressed | 
|  | * BLOCK  0   1   2   3   4 | 
|  | * INDEX  0   4   1   8   2 ... | 
|  | * ARRAY  abcdeabazyabc... | 
|  | * </PRE> | 
|  | * <P> | 
|  | * If you look at the example, index number 2 in the expanded version points | 
|  | * to data position number 8, which has elements "bcde". In the compressed | 
|  | * version, index number 2 points to data position 1, which also has "bcde" | 
|  | * @see                CompactByteArray | 
|  | * @see                CompactIntArray | 
|  | * @see                CompactCharArray | 
|  | * @see                CompactStringArray | 
|  | * @version            $Revision: 1.3 $ 8/25/98 | 
|  | * @author             Helena Shih | 
|  | */ | 
|  |  | 
|  | typedef struct CompactShortArray { | 
|  | int16_t* fArray; | 
|  | uint16_t* fIndex; | 
|  | int32_t* fHashes; | 
|  | int32_t fCount; | 
|  | int16_t fDefaultValue; | 
|  | bool_t fCompact; | 
|  | bool_t fBogus; | 
|  | int32_t kBlockShift; | 
|  | int32_t kBlockMask; | 
|  | } CompactShortArray; | 
|  |  | 
|  |  | 
|  | U_CAPI int32_t U_EXPORT2 ucmp16_getkUnicodeCount(void); | 
|  | U_CAPI int32_t U_EXPORT2 ucmp16_getkBlockCount(void); | 
|  |  | 
|  | /** | 
|  | * Construct an empty CompactShortArray. | 
|  | * @param defaultValue the default value for all characters not explicitly in the array | 
|  | */ | 
|  | U_CAPI  CompactShortArray* U_EXPORT2 ucmp16_open(int16_t defaultValue); | 
|  |  | 
|  | /** | 
|  | * Construct a CompactShortArray from a pre-computed index and values array. The values | 
|  | * will be adobped by the CompactShortArray. Note: for speed, the compact method will | 
|  | * only re-use blocks in the values array that are on a block boundary. The pre-computed | 
|  | * arrays passed in to this constructor may re-use blocks at any position in the values | 
|  | * array. | 
|  | * @param indexArray the index array to be adopted | 
|  | * @param newValues the value array to be adobptd | 
|  | * @param count the number of entries in the value array | 
|  | * @param defaultValue the default value for all characters not explicitly in the array | 
|  | * @see compact | 
|  | */ | 
|  | U_CAPI  CompactShortArray* U_EXPORT2 ucmp16_openAdopt(uint16_t *indexArray, | 
|  | int16_t *newValues, | 
|  | int32_t count, | 
|  | int16_t defaultValue ); | 
|  |  | 
|  | U_CAPI  CompactShortArray* U_EXPORT2 ucmp16_openAdoptWithBlockShift(uint16_t *indexArray, | 
|  | int16_t *newValues, | 
|  | int32_t count, | 
|  | int16_t defaultValue, | 
|  | int32_t blockShift); | 
|  |  | 
|  |  | 
|  | U_CAPI  void U_EXPORT2 ucmp16_close(CompactShortArray* array); | 
|  | /** | 
|  | * Returns TRUE if the creation of the compact array fails. | 
|  | */ | 
|  |  | 
|  | U_CAPI  bool_t U_EXPORT2 ucmp16_isBogus(const CompactShortArray* array); | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Get the mapped value of a Unicode character. | 
|  | * @param index the character to get the mapped value with | 
|  | * @return the mapped value of the given character | 
|  | */ | 
|  |  | 
|  | #define ucmp16_get(array, index) (array->fArray[(array->fIndex[(index >> array->kBlockShift)] )+ \ | 
|  | (index & array->kBlockMask)]) | 
|  |  | 
|  | #define ucmp16_getu(array, index) (uint16_t)ucmp16_get(array, index) | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Set a new value for a Unicode character. | 
|  | * Set automatically expands the array if it is compacted. | 
|  | * @param index the character to set the mapped value with | 
|  | * @param value the new mapped value | 
|  | */ | 
|  | U_CAPI  void U_EXPORT2 ucmp16_set(CompactShortArray *array, | 
|  | UChar index, | 
|  | int16_t value); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Set new values for a range of Unicode character. | 
|  | * @param start the starting offset of the range | 
|  | * @param end the ending offset of the range | 
|  | * @param value the new mapped value | 
|  | */ | 
|  | U_CAPI  void U_EXPORT2 ucmp16_setRange(CompactShortArray* array, | 
|  | UChar start, | 
|  | UChar end, | 
|  | int16_t value); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Compact the array. For efficency, this method will only re-use | 
|  | * blocks in the values array that are on a block bounday. If you | 
|  | * want better compaction, you can do your own compaction and use | 
|  | * the constructor that lets you pass in the pre-computed arrays. | 
|  | */ | 
|  | U_CAPI  void U_EXPORT2 ucmp16_compact(CompactShortArray* array); | 
|  |  | 
|  | /** | 
|  | * Get the default value. | 
|  | */ | 
|  | U_CAPI  int16_t U_EXPORT2 ucmp16_getDefaultValue(const CompactShortArray* array); | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Get the number of elements in the value array. | 
|  | * @return the number of elements in the value array. | 
|  | */ | 
|  | U_CAPI  uint32_t U_EXPORT2 ucmp16_getCount(const CompactShortArray* array); | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Get the address of the value array. | 
|  | * @return the address of the value array | 
|  | */ | 
|  | U_CAPI  const int16_t* U_EXPORT2 ucmp16_getArray(const CompactShortArray* array); | 
|  |  | 
|  | /** | 
|  | * | 
|  | * Get the address of the index array. | 
|  | * @return the address of the index array | 
|  | */ | 
|  | U_CAPI  const uint16_t* U_EXPORT2 ucmp16_getIndex(const CompactShortArray* array); | 
|  |  | 
|  |  | 
|  |  | 
|  | #endif | 
|  |  | 
|  |  | 
|  |  |