Skip to content

Commit d2401af

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 7207350 + 1d9b77e commit d2401af

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.lightningkite.kotlin.bytes
2+
3+
/**
4+
*
5+
* Created by shanethompson on 6/29/17.
6+
*
7+
*/
8+
9+
class IntBitArray(var value: Int = 0) : Iterable<Boolean> {
10+
operator fun get(index: Int): Boolean {
11+
return value.ushr(index).and(0x1) == 1
12+
}
13+
14+
operator fun set(index: Int, isTrue: Boolean) {
15+
if(isTrue) {
16+
value = value or 0x1.shl(index)
17+
} else {
18+
value = value.and(1.shl(index).inv())
19+
}
20+
}
21+
22+
override fun iterator(): Iterator<Boolean> {
23+
return object : Iterator<Boolean> {
24+
var currentIndex = 0
25+
override fun hasNext(): Boolean {
26+
return currentIndex < 32
27+
}
28+
29+
override fun next(): Boolean {
30+
val result = this@IntBitArray[currentIndex]
31+
currentIndex++
32+
return result
33+
}
34+
}
35+
}
36+
}
37+
38+
fun Int.toBitArray(): IntBitArray {
39+
return IntBitArray(this)
40+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.lightningkite.kotlin.bytes
2+
3+
/**
4+
*
5+
* Created by shanethompson on 6/29/17.
6+
*
7+
*/
8+
9+
10+
class LongBitArray(var value: Long = 0) : Iterable<Boolean> {
11+
operator fun get(index: Int): Boolean {
12+
return value.ushr(index).and(0x1) == 1L
13+
}
14+
15+
operator fun set(index: Int, isTrue: Boolean) {
16+
if(isTrue) {
17+
value = value or 0x1.shl(index).toLong()
18+
} else {
19+
value = value.and(1.shl(index).inv().toLong())
20+
}
21+
}
22+
23+
override fun iterator(): Iterator<Boolean> {
24+
return object : Iterator<Boolean> {
25+
var currentIndex = 0
26+
override fun hasNext(): Boolean {
27+
return currentIndex < 64
28+
}
29+
30+
override fun next(): Boolean {
31+
val result = this@LongBitArray[currentIndex]
32+
currentIndex++
33+
return result
34+
}
35+
}
36+
}
37+
}
38+
39+
fun Long.toBitArray(): LongBitArray {
40+
return LongBitArray(this)
41+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.lightningkite.kotlin
2+
3+
import com.lightningkite.kotlin.bytes.toBitArray
4+
import org.junit.Test
5+
import org.junit.Assert.*
6+
7+
class BitArrayTest {
8+
9+
@Test
10+
fun testIntBitArray() {
11+
var intArray = 0.toBitArray()
12+
intArray.forEach {
13+
assertFalse(it)
14+
}
15+
assertEquals(0, intArray.value)
16+
intArray[0] = true
17+
assertEquals(1, intArray.value)
18+
intArray[4] = true
19+
intArray.forEachIndexed { index, b ->
20+
when(index) {
21+
0 -> assertTrue(b)
22+
4 -> assertTrue(b)
23+
else -> assertFalse(b)
24+
}
25+
}
26+
intArray[31] = true
27+
assertTrue(intArray[31])
28+
for(i in 0..31) {
29+
intArray[i] = true
30+
}
31+
intArray.forEach { assertTrue(it) }
32+
}
33+
34+
@Test
35+
fun testLongArray() {
36+
var longArray = 0L.toBitArray()
37+
longArray.forEach {
38+
assertFalse(it)
39+
}
40+
assertEquals(0, longArray.value)
41+
longArray[0] = true
42+
assertEquals(1, longArray.value)
43+
longArray[4] = true
44+
longArray.forEachIndexed { index, b ->
45+
when(index) {
46+
0 -> assertTrue(b)
47+
4 -> assertTrue(b)
48+
else -> assertFalse(b)
49+
}
50+
}
51+
longArray[31] = true
52+
assertTrue(longArray[31])
53+
for(i in 0..63) {
54+
longArray[i] = true
55+
}
56+
longArray.forEach { assertTrue(it) }
57+
}
58+
}

0 commit comments

Comments
 (0)