2 * Copyright (C) 1996-2004, International Business Machines
\r
3 * Corporation and others. All Rights Reserved.
\r
8 Modified to search portions of an integer array. Should be retested.
\r
11 package com.ibm.richtext.styledtext;
\r
14 * This class searches a segment of an array of integers. The segment
\r
15 * must be sorted in ascending order (but this class does not verify this).
\r
16 * Also, this class aliases the array; if the array is modified later the
\r
17 * search results are undefined.
\r
19 final class FastIntBinarySearch
\r
21 static final String COPYRIGHT =
\r
22 "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
\r
23 private int dataArray[];
\r
24 private int auxStart;
\r
27 private int fFirstIndex;
\r
29 private static final int exp2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072 };
\r
31 public FastIntBinarySearch(int data[])
\r
33 this(data, 0, data.length);
\r
36 public FastIntBinarySearch(int data[], int firstValidIndex, int validLength)
\r
38 setData(data, firstValidIndex, validLength);
\r
41 public void setData(int data[]) {
\r
43 setData(data, 0, data.length);
\r
46 public void setData(int data[], int firstValidIndex, int validLength) {
\r
48 if (data.length < 1) throw new IllegalArgumentException();
\r
49 if (data.length >= exp2[exp2.length-1]) throw new IllegalArgumentException();
\r
52 fFirstIndex = firstValidIndex;
\r
54 for (power = exp2.length-1; power > 0 && validLength < exp2[power]; power--) {}
\r
56 // at this point, array.length >= 2^power
\r
58 auxStart = validLength - exp2[power];
\r
62 * Return the index in the array of the first element which is at least
\r
63 * as large as <tt>value</tt>. If value is larger than the largest
\r
64 * element in the array the last valid index in the array is returned.
\r
66 public int findIndex(int value)
\r
68 int index = exp2[power]-1 + fFirstIndex;
\r
69 if (value >= dataArray[auxStart + fFirstIndex]) {
\r
73 // at this point, index is the "upper limit" of the search
\r
77 if (value < dataArray[index-65536]) index -= 65536;
\r
79 if (value < dataArray[index-32768]) index -= 32768;
\r
81 if (value < dataArray[index-16384]) index -= 16384;
\r
83 if (value < dataArray[index-8192]) index -= 8192;
\r
85 if (value < dataArray[index-4096]) index -= 4096;
\r
87 if (value < dataArray[index-2048]) index -= 2048;
\r
89 if (value < dataArray[index-1024]) index -= 1024;
\r
91 if (value < dataArray[index-512]) index -= 512;
\r
93 if (value < dataArray[index-256]) index -= 256;
\r
95 if (value < dataArray[index-128]) index -= 128;
\r
97 if (value < dataArray[index-64]) index -= 64;
\r
99 if (value < dataArray[index-32]) index -= 32;
\r
101 if (value < dataArray[index-16]) index -= 16;
\r
103 if (value < dataArray[index-8]) index -= 8;
\r
105 if (value < dataArray[index-4]) index -= 4;
\r
107 if (value < dataArray[index-2]) index -= 2;
\r
109 if (value < dataArray[index-1]) index -= 1;
\r
111 if (value < dataArray[index]) index -= 1;
\r