fontservices/textshaperplugin/IcuSource/common/ucmp8.h
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontservices/textshaperplugin/IcuSource/common/ucmp8.h	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,244 @@
+/*
+ ********************************************************************
+ * COPYRIGHT: 
+ * Copyright (c) 1996-2004, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ ********************************************************************
+ */
+
+
+
+#ifndef UCMP8_H
+#define UCMP8_H
+
+/* 32-bits.
+  Bump this whenever the internal structure changes.
+*/
+#define ICU_UCMP8_VERSION 0x01260000
+
+#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 int32_t U_EXPORT2 ucmp8_getkUnicodeCount(void);
+U_CAPI int32_t U_EXPORT2 ucmp8_getkBlockCount(void);
+
+typedef struct CompactByteArray {
+  uint32_t fStructSize;
+  int8_t* fArray;
+  uint16_t* fIndex;
+  int32_t fCount;
+  UBool fCompact;
+  UBool fBogus;
+  UBool fAlias;
+  UBool fIAmOwned; /* don't free CBA on close */
+} CompactByteArray;
+
+#define UCMP8_kUnicodeCount 65536
+#define UCMP8_kBlockShift 7
+#define UCMP8_kBlockCount (1<<UCMP8_kBlockShift)
+#define UCMP8_kIndexShift (16-UCMP8_kBlockShift)
+#define UCMP8_kIndexCount (1<<UCMP8_kIndexShift)
+#define UCMP8_kBlockMask (UCMP8_kBlockCount-1)
+
+
+/**
+ * Construct an empty CompactByteArray with uprv_malloc(). Do not call any of the
+ * ucmp8_init*() functions after using this function. They will cause a memory
+ * leak.
+ *
+ * @param defaultValue the default value for all characters not explicitly in the array
+ * @see ucmp8_init
+ * @see ucmp8_initBogus
+ * @return The initialized array.
+ */
+U_CAPI  CompactByteArray* U_EXPORT2 ucmp8_open(int8_t defaultValue);
+
+/**
+ * Construct a CompactByteArray from a pre-computed index and values array. The values
+ * will be adopted by the CompactByteArray. 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
+ * @return the newly constructed ComapctByteArray
+ * @see compact
+ */
+U_CAPI  CompactByteArray* U_EXPORT2 ucmp8_openAdopt(uint16_t* indexArray, 
+                               int8_t* newValues,
+                               int32_t count);
+
+/**
+ * Construct a CompactByteArray from a pre-computed index and values array. The values
+ * will be aliased by the CompactByteArray. 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
+ * @return the newly constructed CompactByteArray
+ * @see compact
+ */
+U_CAPI  CompactByteArray* U_EXPORT2 ucmp8_openAlias(uint16_t* indexArray, 
+                               int8_t* newValues,
+                               int32_t count);
+
+
+/**
+ * Initialize an empty CompactByteArray. Do not call this function
+ * if you created the array with ucmp8_open() because it will cause a memory
+ * leak.
+ *
+ * @param defaultValue the default value for all characters not explicitly in the array
+ * @param array An uninitialized CompactByteArray
+ * @see ucmp8_open
+ */
+U_CAPI  void U_EXPORT2 ucmp8_init(CompactByteArray* array, int8_t defaultValue);
+
+/**
+ * Initialize an empty CompactByteArray to the bogus value. Do not call this
+ * function if you created the array with ucmp8_open() because it will cause
+ * a memory leak.
+ *
+ * @param array An uninitialized CompactByteArray
+ * @see ucmp8_open
+ * @see ucmp8_isBogus
+ */
+U_CAPI  void U_EXPORT2 ucmp8_initBogus(CompactByteArray* array);
+
+/**
+ * Initialize a CompactByteArray from a pre-computed index and values array. The values
+ * will be adopted by the CompactByteArray. 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 this_obj An uninitialized CompactByteArray
+ * @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
+ * @return the pointer refers to the CompactByteArray
+ * @see compact
+ */
+U_CAPI  CompactByteArray* U_EXPORT2 ucmp8_initAdopt(CompactByteArray *this_obj,
+                               uint16_t* indexArray, 
+                               int8_t* newValues,
+                               int32_t count);
+
+/**
+ * Initialize a CompactByteArray from a pre-computed index and values array. The values
+ * will be aliased by the CompactByteArray. 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 this_obj An uninitialized CompactByteArray
+ * @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
+ * @return the pointer refers to the CompactByteArray
+ * @see compact
+ */
+U_CAPI  CompactByteArray* U_EXPORT2 ucmp8_initAlias(CompactByteArray *this_obj,
+                               uint16_t* indexArray, 
+                               int8_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 ucmp8_close(CompactByteArray* array);
+
+/**
+ * Returns TRUE if the creation of the compact array fails.
+ * @param array The CompactByteArray to be created.
+ * @return TRUE if the creation of the compact array fails.
+ */
+U_CAPI  UBool U_EXPORT2 ucmp8_isBogus(const CompactByteArray* 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 ucmp8_get(array, index)  (array->fArray[(array->fIndex[index >> UCMP8_kBlockShift] & 0xFFFF) + (index & UCMP8_kBlockMask)])
+
+#define ucmp8_getu(array,index) (uint8_t)ucmp8_get(array,index)
+
+
+/**
+ * Set a new value for a Unicode character.
+ * Set automatically expands the array if it is compacted.
+ *
+ * @param array the CompactByteArray to be set
+ * @param character the character to set the mapped value with
+ * @param value the new mapped value
+ */
+U_CAPI  void U_EXPORT2 ucmp8_set(CompactByteArray* array,
+                 UChar character,
+                 int8_t value);
+
+/**
+ * Set new values for a range of Unicode character.
+ *
+ * @param array the CompactByteArray to be set
+ * @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 ucmp8_setRange(CompactByteArray* array, 
+                  UChar start,
+                  UChar end, 
+                  int8_t value);
+
+U_CAPI  int32_t U_EXPORT2 ucmp8_getCount(const CompactByteArray* array);
+U_CAPI  const int8_t* U_EXPORT2 ucmp8_getArray(const CompactByteArray* array);
+U_CAPI  const uint16_t* U_EXPORT2 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.
+ * @param array The CompactByteArray to be compacted
+ * @param cycle The value determines how large the overlap can be.
+ */
+U_CAPI  void U_EXPORT2 ucmp8_compact(CompactByteArray* array, 
+                 uint32_t cycle);
+
+/** Expanded takes the array back to a 65536 element array
+ *  @param array The CompactByteArray to be expanded
+ */
+U_CAPI  void U_EXPORT2 ucmp8_expand(CompactByteArray* array);
+
+/** 
+ * Flatten into a memory structure. Pass in NULL to pre-flight to get the required size.
+ * @internal
+ */
+U_CAPI  uint32_t U_EXPORT2 ucmp8_flattenMem(const CompactByteArray* array, uint8_t *MS);
+
+/* initializes an existing CBA from memory.  Will cause ucmp8_close() to not deallocate anything. */
+U_CAPI  void U_EXPORT2 ucmp8_initFromData(CompactByteArray* array, const uint8_t **source, UErrorCode *status);
+
+#endif
+