2 *******************************************************************************
\r
3 * Copyright (C) 2002-2010, International Business Machines
\r
4 * Corporation and others. All Rights Reserved.
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.impl;
\r
11 * @author Markus W. Scherer
\r
12 * Ram: Add documentation, remove unwanted methods, improve coverage.
\r
16 * Simple class for handling serialized USet/UnicodeSet structures
\r
17 * without object creation. See ICU4C icu/source/common/uset.c.
\r
21 public final class USerializedSet {
\r
23 * Fill in the given serialized set object.
\r
24 * @param src pointer to start of array
\r
25 * @param srcStart pointer to start of serialized data (length value)
\r
26 * @return true if the given array is valid, otherwise false
\r
28 public final boolean getSet(char src[], int srcStart) {
\r
29 // leave most argument checking up to Java exceptions
\r
31 arrayOffset=bmpLength=length=0;
\r
33 length=src[srcStart++];
\r
36 if((length&0x8000) >0) {
\r
37 /* there are supplementary values */
\r
39 if(src.length<(srcStart+1+length)) {
\r
41 throw new IndexOutOfBoundsException();
\r
43 bmpLength=src[srcStart++];
\r
45 /* only BMP values */
\r
46 if(src.length<(srcStart+length)) {
\r
48 throw new IndexOutOfBoundsException();
\r
52 array = new char[length];
\r
53 System.arraycopy(src,srcStart,array,0,length);
\r
54 //arrayOffset=srcStart;
\r
59 * Set the USerializedSet to contain the given character (and nothing
\r
62 public final void setToOne(int c) {
\r
70 array[1]=(char)(c+1);
\r
71 } else if(c==0xffff) {
\r
77 } else if(c<0x10ffff) {
\r
80 array[0]=(char)(c>>16);
\r
83 array[2]=(char)(c>>16);
\r
85 } else /* c==0x10ffff */ {
\r
94 * Returns a range of characters contained in the given serialized
\r
96 * @param rangeIndex a non-negative integer in the range <code>0..
\r
97 * getSerializedRangeCount()-1</code>
\r
98 * @param range variable to receive the data in the range
\r
99 * @return true if rangeIndex is valid, otherwise false
\r
101 public final boolean getRange(int rangeIndex, int[] range) {
\r
102 if( rangeIndex<0) {
\r
106 array = new char[8];
\r
108 if(range==null || range.length <2){
\r
109 throw new IllegalArgumentException();
\r
111 rangeIndex*=2; /* address start/limit pairs */
\r
112 if(rangeIndex<bmpLength) {
\r
113 range[0]=array[rangeIndex++];
\r
114 if(rangeIndex<bmpLength) {
\r
115 range[1]=array[rangeIndex]-1;
\r
116 } else if(rangeIndex<length) {
\r
117 range[1]=((((int)array[rangeIndex])<<16)|array[rangeIndex+1])-1;
\r
123 rangeIndex-=bmpLength;
\r
124 rangeIndex*=2; /* address pairs of pairs of units */
\r
125 int suppLength=length-bmpLength;
\r
126 if(rangeIndex<suppLength) {
\r
127 int offset=arrayOffset+bmpLength;
\r
128 range[0]=(((int)array[offset+rangeIndex])<<16)|array[offset+rangeIndex+1];
\r
130 if(rangeIndex<suppLength) {
\r
131 range[1]=((((int)array[offset+rangeIndex])<<16)|array[offset+rangeIndex+1])-1;
\r
143 * Returns true if the given USerializedSet contains the given
\r
145 * @param c the character to test for
\r
146 * @return true if set contains c
\r
148 public final boolean contains(int c) {
\r
156 /* find c in the BMP part */
\r
157 for(i=0; i<bmpLength && (char)c>=array[i]; ++i) {}
\r
158 return ((i&1) != 0);
\r
161 /* find c in the supplementary part */
\r
162 char high=(char)(c>>16), low=(char)c;
\r
164 i<length && (high>array[i] || (high==array[i] && low>=array[i+1]));
\r
167 /* count pairs of 16-bit units even per BMP and check if the number of pairs is odd */
\r
168 return (((i+bmpLength)&2)!=0);
\r
173 * Returns the number of disjoint ranges of characters contained in
\r
174 * the given serialized set. Ignores any strings contained in the
\r
176 * @return a non-negative integer counting the character ranges
\r
179 public final int countRanges() {
\r
180 return (bmpLength+(length-bmpLength)/2+1)/2;
\r
183 private char array[] = new char[8];
\r
184 private int arrayOffset, bmpLength, length;
\r