We do actually have an implementation of binarySearch, i think in Fields. The
reason was that java's version doesn't take (offset, length), and in some
cases (RequestCooldownQueue iirc), we need to search with them.
I suggest you coalesce the two, and test the resulting function.
On Saturday 12 April 2008 15:01, j16sdiz at freenetproject.org wrote:
> Author: j16sdiz
> Date: 2008-04-12 14:01:07 +0000 (Sat, 12 Apr 2008)
> New Revision: 19230
>
> Modified:
> trunk/freenet/src/freenet/support/SortedLongSet.java
> trunk/freenet/test/freenet/support/SortedLongSetTest.java
> Log:
> make SortedLongSet accept Long.MAX_VALUE
>
>
> Modified: trunk/freenet/src/freenet/support/SortedLongSet.java
> ===================================================================
> --- trunk/freenet/src/freenet/support/SortedLongSet.java 2008-04-12
> 13:53:10
UTC (rev 19229)
> +++ trunk/freenet/src/freenet/support/SortedLongSet.java 2008-04-12
> 14:01:07
UTC (rev 19230)
> @@ -48,7 +48,7 @@
> * @return <code>true</code>, if <code>num</code> exist.
> */
> public synchronized boolean contains(long num) {
> - int x = Arrays.binarySearch(data, num);
> + int x = binarySearch(num);
> if(x >= 0)
> return true;
> else
> @@ -62,7 +62,7 @@
> * the item to be removed
> */
> public synchronized void remove(long item) {
> - int x = Arrays.binarySearch(data, item);
> + int x = binarySearch(item);
> if(x >= 0) {
> if(x < length-1)
> System.arraycopy(data, x+1, data, x,
> length-x-1);
> @@ -98,12 +98,12 @@
>
> /**
> * Add the item, if it (or an item of the same number) is not already
> - * present. <strong>This method does not accept
<code>Long.MAX_VALUE</code>.</strong>
> + * present.
> *
> * @return <code>true</code>, if we added the item.
> */
> public synchronized boolean push(long num) {
> - int x = Arrays.binarySearch(data, num);
> + int x = binarySearch(num);
> if(x >= 0) return false;
> // insertion point
> x = -x-1;
> @@ -114,14 +114,12 @@
> /**
> * Add the item.
> *
> - * <strong>This method does not accept
<code>Long.MAX_VALUE</code>.</strong>
> - *
> * @throws {@link IllegalArgumentException}
> * if the item already exist
> * @return <code>true</code>, if we added the item.
> */
> public synchronized void add(long num) {
> - int x = Arrays.binarySearch(data, num);
> + int x = binarySearch(num);
> if(x >= 0) throw new IllegalArgumentException(); // already
> exists
> // insertion point
> x = -x-1;
> @@ -179,4 +177,21 @@
> return output;
> }
>
> + private int binarySearch(long key) {
> + int low = 0;
> + int high = length - 1;
> +
> + while (low <= high) {
> + int mid = (low + high) >> 1;
> + long midVal = data[mid];
> +
> + if (midVal < key)
> + low = mid + 1;
> + else if (midVal > key)
> + high = mid - 1;
> + else
> + return mid; // key found
> + }
> + return -(low + 1); // key not found.
> + }
> }
>
> Modified: trunk/freenet/test/freenet/support/SortedLongSetTest.java
> ===================================================================
> --- trunk/freenet/test/freenet/support/SortedLongSetTest.java 2008-04-12
13:53:10 UTC (rev 19229)
> +++ trunk/freenet/test/freenet/support/SortedLongSetTest.java 2008-04-12
14:01:07 UTC (rev 19230)
> @@ -8,13 +8,7 @@
> * @author sdiz
> */
> public class SortedLongSetTest extends TestCase {
> - /*
> - * FIXME use Long.MAX_VALUE , not MAX_VALUE - 1
> - */
> - private final static long[] testArray = {
> - 10, 8, 6, 2, 0, 1, 11,
> - Long.MAX_VALUE - 1, 4, 7, 5, 3, Long.MIN_VALUE
> - };
> + private final static long[] testArray = { 10, 8, 6, 2, 0, 1, 11,
Long.MAX_VALUE, 4, 7, 5, 3, Long.MIN_VALUE };
>
> protected SortedLongSet perpare(long[] array) {
> SortedLongSet set = new SortedLongSet();
> @@ -60,7 +54,7 @@
> // Contain
> assertTrue(set.contains(0L));
> assertTrue(set.contains(3L));
> - assertTrue(set.contains(Long.MAX_VALUE - 1));
> + assertTrue(set.contains(Long.MAX_VALUE));
> assertTrue(set.contains(Long.MIN_VALUE));
>
> // Not contain
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080414/5e7549c9/attachment.pgp>