Skip to content

Commit f1179cf

Browse files
committed
Added FromDigits support for BitVector
1 parent 674e58f commit f1179cf

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package scodec.bits
2+
3+
import scala.quoted._
4+
import scala.quoted.matching._
5+
import scala.util.FromDigits
6+
7+
private[bits] trait BitVectorPlatform { self: BitVector.type =>
8+
given as FromDigits.WithRadix[BitVector] = BitVectorFromDigits.Instance
9+
}
10+
11+
private[bits] object BitVectorFromDigits {
12+
13+
class Base extends FromDigits.WithRadix[BitVector] {
14+
def fromDigits(digits: String, radix: Int): BitVector =
15+
digitsToBitVector(digits, radix)
16+
}
17+
18+
private def digitsToBitVector(digits: String, radix: Int): BitVector =
19+
if (radix == 16) ByteVector.fromValidHex(digits.tail).bits
20+
else throw FromDigits.MalformedNumber(s"unsupported radix $radix")
21+
22+
object Instance extends Base {
23+
override inline def fromDigits(digits: String): BitVector =
24+
${digitsToBitVectorMacro('digits, Expr(10))}
25+
override inline def fromDigits(digits: String, radix: Int): BitVector =
26+
${digitsToBitVectorMacro('digits, 'radix)}
27+
}
28+
29+
private def digitsToBitVectorMacro(digits: Expr[String], radix: Expr[Int])(given qctx: QuoteContext): Expr[BitVector] =
30+
(digits, radix) match {
31+
case (Const(ds), Const(r)) =>
32+
if (r == 16) {
33+
'{ByteVector.fromValidHex($digits.tail).bits}
34+
} else {
35+
qctx.error(s"unsupported radix $r", radix)
36+
'{BitVector.empty}
37+
}
38+
case other =>
39+
'{digitsToBitVector($digits, $radix)}
40+
}
41+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package scodec.bits
2+
3+
private[bits] trait BitVectorPlatform
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package scodec.bits
2+
3+
private[bits] trait BitVectorPlatform

core/shared/src/main/scala/scodec/bits/BitVector.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,7 @@ sealed abstract class BitVector extends BitwiseOperations[BitVector, Long] with
12841284
* @groupname base Base Conversions
12851285
* @groupprio base 3
12861286
*/
1287-
object BitVector {
1287+
object BitVector extends BitVectorPlatform {
12881288

12891289
/**
12901290
* Empty bit vector.

0 commit comments

Comments
 (0)