diff options
-rw-r--r-- | src/java/com/jogamp/common/util/Bitfield.java | 2 | ||||
-rw-r--r-- | src/java/jogamp/common/util/Int32ArrayBitfield.java | 14 | ||||
-rw-r--r-- | src/java/jogamp/common/util/Int32Bitfield.java | 14 | ||||
-rw-r--r-- | src/java/jogamp/common/util/SyncedBitfield.java | 4 | ||||
-rw-r--r-- | src/junit/com/jogamp/common/util/TestBitfield00.java | 8 |
5 files changed, 27 insertions, 15 deletions
diff --git a/src/java/com/jogamp/common/util/Bitfield.java b/src/java/com/jogamp/common/util/Bitfield.java index d7ada5a..4b2b9d5 100644 --- a/src/java/com/jogamp/common/util/Bitfield.java +++ b/src/java/com/jogamp/common/util/Bitfield.java @@ -173,7 +173,7 @@ public interface Bitfield { * @param bitnum bit number, restricted to [0..{@link #size()}-1]. * @throws IndexOutOfBoundsException if {@code bitnum} is out of bounds */ - void put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException; + boolean put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException; /** * Set the bit at position <code>bitnum</code> according to <code>bit</code>. diff --git a/src/java/jogamp/common/util/Int32ArrayBitfield.java b/src/java/jogamp/common/util/Int32ArrayBitfield.java index 3dcb9ae..5bc95eb 100644 --- a/src/java/jogamp/common/util/Int32ArrayBitfield.java +++ b/src/java/jogamp/common/util/Int32ArrayBitfield.java @@ -142,16 +142,20 @@ public class Int32ArrayBitfield implements Bitfield { } @Override - public final void put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { + public final boolean put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { check(bitSize, bitnum); final int u = bitnum >>> UNIT_SHIFT; final int b = bitnum - ( u << UNIT_SHIFT ); final int m = 1 << b; - if( bit ) { - storage[u] |= m; - } else { - storage[u] &= ~m; + final boolean prev = 0 != ( storage[u] & m ) ; + if( prev != bit ) { + if( bit ) { + storage[u] |= m; + } else { + storage[u] &= ~m; + } } + return prev; } @Override public final void set(final int bitnum) throws IndexOutOfBoundsException { diff --git a/src/java/jogamp/common/util/Int32Bitfield.java b/src/java/jogamp/common/util/Int32Bitfield.java index 9bf2117..7b55a59 100644 --- a/src/java/jogamp/common/util/Int32Bitfield.java +++ b/src/java/jogamp/common/util/Int32Bitfield.java @@ -115,14 +115,18 @@ public class Int32Bitfield implements Bitfield { return 0 != ( storage & ( 1 << bitnum ) ) ; } @Override - public final void put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { + public final boolean put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { check(UNIT_SIZE, bitnum); final int m = 1 << bitnum; - if( bit ) { - storage |= m; - } else { - storage &= ~m; + final boolean prev = 0 != ( storage & m ) ; + if( prev != bit ) { + if( bit ) { + storage |= m; + } else { + storage &= ~m; + } } + return prev; } @Override public final void set(final int bitnum) throws IndexOutOfBoundsException { diff --git a/src/java/jogamp/common/util/SyncedBitfield.java b/src/java/jogamp/common/util/SyncedBitfield.java index c23d7ea..49c27b0 100644 --- a/src/java/jogamp/common/util/SyncedBitfield.java +++ b/src/java/jogamp/common/util/SyncedBitfield.java @@ -70,8 +70,8 @@ public class SyncedBitfield implements Bitfield { } @Override - public final synchronized void put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { - impl.put(bitnum, bit); + public final synchronized boolean put(final int bitnum, final boolean bit) throws IndexOutOfBoundsException { + return impl.put(bitnum, bit); } @Override diff --git a/src/junit/com/jogamp/common/util/TestBitfield00.java b/src/junit/com/jogamp/common/util/TestBitfield00.java index a2d5d73..bb8ca37 100644 --- a/src/junit/com/jogamp/common/util/TestBitfield00.java +++ b/src/junit/com/jogamp/common/util/TestBitfield00.java @@ -320,12 +320,16 @@ public class TestBitfield00 extends SingletonJunitCase { assertEquals(bf, lowBitnum+1, d.val, d.pattern, oneBitCount); } + // test put() return value (previous value) + bf.clearField(false); + Assert.assertEquals(msg+", bitpos "+0, false, bf.put(lowBitnum+0, true)); + Assert.assertEquals(msg+", bitpos "+0, true, bf.put(lowBitnum+0, false)); + // // via put // - bf.clearField(false); for(int i=0; i<d.bitSize; i++) { - bf.put(lowBitnum+i, 0 != ( d.val & ( 1 << i ) )); + Assert.assertEquals(msg+", bitpos "+i, false, bf.put(lowBitnum+i, 0 != ( d.val & ( 1 << i ) ))); } Assert.assertEquals(msg, d.val, bf.get32(lowBitnum, d.bitSize)); for(int i=0; i<d.bitSize; i++) { |