/* ********************************************************************** * Copyright (C) 1995-2001, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * and others. All Rights Reserved. * @version 1.0 23/10/96 * @author Helena Shih * Based on Taligent international support for java * Modification History : * * Date Name Description * 2/5/97 aliu Added CompactIntArray streamIn and streamOut methods. * 05/07/97 helena Added isBogus() * 04/26/99 Madhu Ported to C for C Implementation * 11/21/99 srl macroized ucmp32_get() */ #ifndef UCMP32_H #define UCMP32_H #define ICU_UCMP32_VERSION 0x01260000 #include "unicode/utypes.h" #include "filestrm.h" #include "umemstrm.h" /* INTERNAL CONSTANTS */ #define UCMP32_kBlockShift 7 #define UCMP32_kBlockCount (1< * A compact array of any primitive data type serves two purposes: * *

* 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 *

 * Example: Expanded
 * BLOCK  0   1   2   3   4
 * INDEX  0   4   8   12  16 ...
 * ARRAY  abcdeababcdezyabcdea...
 *        |   |   |   |   |   |...
 * 
*

* 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 *

 * Example: Compressed
 * BLOCK  0   1   2   3   4
 * INDEX  0   4   1   8   2 ...
 * ARRAY  abcdeabazyabc...
 * 
*

* 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.17 $ 8/25/98 * @author Helena Shih */ /*==================================== *CompactIntArray * 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. *==================================== */ typedef struct CompactIntArray{ uint32_t fStructSize; int32_t* fArray; uint16_t* fIndex; int32_t fCount; UBool fCompact; UBool fBogus; UBool fAlias; UBool fIAmOwned; /* don't free CBA on close */ } CompactIntArray; U_CAPI int32_t U_EXPORT2 ucmp32_getkUnicodeCount(void); U_CAPI int32_t U_EXPORT2 ucmp32_getkBlockCount(void); /** * Construct an empty CompactIntArray. * * @param defaultValue the default value for all characters not explicitly in the array */ U_CAPI CompactIntArray* U_EXPORT2 ucmp32_open(int32_t defaultValue); /** * Construct a CompactIntArray from a pre-computed index and values array. The values * will be adopted by the CompactIntArray. Memory is allocated with uprv_malloc. * 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. The indexArray and * newValues will be uprv_free'd when ucmp16_close() is called. * * @param indexArray the index array to be adopted * @param newValues the value array to be adopted * @param count the number of entries in the value array * @see compact */ U_CAPI CompactIntArray* U_EXPORT2 ucmp32_openAdopt(uint16_t *indexArray, int32_t *newValues, int32_t count); /** * Construct a CompactIntArray from a pre-computed index and values array. The values * will be aliased by the CompactIntArray. Memory is allocated with uprv_malloc. * 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 adopted * @param count the number of entries in the value array * @see compact */ U_CAPI CompactIntArray* U_EXPORT2 ucmp32_openAlias(uint16_t *indexArray, int32_t *newValues, int32_t count); /** * Initialize a CompactIntArray from a pre-computed index and values array. The values * will be adopted by the CompactIntArray. No memory is allocated. 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. The indexArray and * newValues will be uprv_free'd when ucmp16_close() is called. * * @param indexArray the index array to be adopted * @param newValues the value array to be adopted * @param count the number of entries in the value array * @see compact */ U_CAPI CompactIntArray* U_EXPORT2 ucmp32_initAdopt(CompactIntArray *this_obj, uint16_t *indexArray, int32_t *newValues, int32_t count); /** * Initialize a CompactIntArray from a pre-computed index and values array. The values * will be aliased by the CompactIntArray. No memory is allocated. 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 adopted * @param count the number of entries in the value array * @see compact */ U_CAPI CompactIntArray* U_EXPORT2 ucmp32_initAlias(CompactIntArray *this_obj, uint16_t *indexArray, int32_t *newValues, int32_t count); /** * Free up any allocated memory associated with this compact array. * The memory that is uprv_free'd depends on how the array was initialized * or opened. * * @param array The compact array to close */ U_CAPI void U_EXPORT2 ucmp32_close(CompactIntArray* array); /** * Returns TRUE if the creation of the compact array fails. */ U_CAPI UBool U_EXPORT2 ucmp32_isBogus(const CompactIntArray* 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 ucmp32_get(array, index) (array->fArray[(array->fIndex[(index >> UCMP32_kBlockShift)] )+ \ (index & UCMP32_kBlockMask)]) #define ucmp32_getu(array, index) (uint16_t)ucmp32_get(array, index) /** * Set a new value for a Unicode character. * Set automatically expands the array if it is compacted. * @param character the character to set the mapped value with * @param value the new mapped value */ U_CAPI void U_EXPORT2 ucmp32_set(CompactIntArray *array, UChar character, int32_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 ucmp32_setRange(CompactIntArray* array, UChar start, UChar end, int32_t value); /** * 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 U_EXPORT2 ucmp32_compact(CompactIntArray* array, int32_t cycle); /** * Expands the compacted array. * Takes the array back to a 65536 element array */ U_CAPI void U_EXPORT2 ucmp32_expand(CompactIntArray* 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 ucmp32_getCount(const CompactIntArray* array); /** * Get the address of the value array. * * @return the address of the value array */ U_CAPI const int32_t* U_EXPORT2 ucmp32_getArray(const CompactIntArray* array); /** * Get the address of the index array. * * @return the address of the index array */ U_CAPI const uint16_t* U_EXPORT2 ucmp32_getIndex(const CompactIntArray* array); U_CAPI void U_EXPORT2 ucmp32_streamIn( CompactIntArray* array, FileStream* is); U_CAPI void U_EXPORT2 ucmp32_streamOut(CompactIntArray* array, FileStream* os); U_CAPI void U_EXPORT2 ucmp32_streamMemIn( CompactIntArray* array, UMemoryStream* is); U_CAPI void U_EXPORT2 ucmp32_streamMemOut(CompactIntArray* array, UMemoryStream* os); U_CAPI uint32_t U_EXPORT2 ucmp32_flattenMem(const CompactIntArray* array, UMemoryStream *MS); U_CAPI CompactIntArray* U_EXPORT2 ucmp32_openFromData( const uint8_t **source, UErrorCode *status); U_CAPI void U_EXPORT2 ucmp32_initFromData(CompactIntArray *this_obj, const uint8_t **source, UErrorCode *status); #endif