|
| 1 | +/* __ *\ |
| 2 | +** ________ ___ / / ___ Scala API ** |
| 3 | +** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL ** |
| 4 | +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** |
| 5 | +** /____/\___/_/ |_/____/_/ | | ** |
| 6 | +** |/ ** |
| 7 | +\* */ |
| 8 | + |
| 9 | +package strawman.collection |
| 10 | +package generic |
| 11 | + |
| 12 | +import scala.Predef.{String, intWrapper, longWrapper} |
| 13 | + |
| 14 | +/** Some bit operations. |
| 15 | + * |
| 16 | + * See http://www.drmaciver.com/2008/08/unsigned-comparison-in-javascala/ for |
| 17 | + * an explanation of unsignedCompare. |
| 18 | + */ |
| 19 | +private[collection] object BitOperations { |
| 20 | + trait Int { |
| 21 | + type Int = scala.Int |
| 22 | + def zero(i: Int, mask: Int) = (i & mask) == 0 |
| 23 | + def mask(i: Int, mask: Int) = i & (complement(mask - 1) ^ mask) |
| 24 | + def hasMatch(key: Int, prefix: Int, m: Int) = mask(key, m) == prefix |
| 25 | + def unsignedCompare(i: Int, j: Int) = (i < j) ^ (i < 0) ^ (j < 0) |
| 26 | + def shorter(m1: Int, m2: Int) = unsignedCompare(m2, m1) |
| 27 | + def complement(i: Int) = (-1) ^ i |
| 28 | + def bits(num: Int) = 31 to 0 by -1 map (i => (num >>> i & 1) != 0) |
| 29 | + def bitString(num: Int, sep: String = "") = bits(num) map (b => if (b) "1" else "0") mkString sep |
| 30 | + def highestOneBit(j: Int) = java.lang.Integer.highestOneBit(j) |
| 31 | + } |
| 32 | + object Int extends Int |
| 33 | + |
| 34 | + trait Long { |
| 35 | + type Long = scala.Long |
| 36 | + def zero(i: Long, mask: Long) = (i & mask) == 0L |
| 37 | + def mask(i: Long, mask: Long) = i & (complement(mask - 1) ^ mask) |
| 38 | + def hasMatch(key: Long, prefix: Long, m: Long) = mask(key, m) == prefix |
| 39 | + def unsignedCompare(i: Long, j: Long) = (i < j) ^ (i < 0L) ^ (j < 0L) |
| 40 | + def shorter(m1: Long, m2: Long) = unsignedCompare(m2, m1) |
| 41 | + def complement(i: Long) = (-1L) ^ i |
| 42 | + def bits(num: Long) = 63L to 0L by -1L map (i => (num >>> i & 1L) != 0L) |
| 43 | + def bitString(num: Long, sep: String = "") = bits(num) map (b => if (b) "1" else "0") mkString sep |
| 44 | + def highestOneBit(j: Long) = java.lang.Long.highestOneBit(j) |
| 45 | + } |
| 46 | + object Long extends Long |
| 47 | +} |
0 commit comments