Browse Source

integerFromBitsArray done with help of protocol Initiable and few extensions

Marcin Krzyżanowski 11 years ago
parent
commit
4a62665775

+ 1 - 8
CryptoSwift/ByteExtension.swift

@@ -33,14 +33,7 @@ extension Byte {
 extension Byte {
 
     init(bits: [Bit]) {
-        var bitPattern = 0 as Byte
-        for (idx,b) in enumerate(bits) {
-            if (b == Bit.One) {
-                let bit = Byte(1 << idx)
-                bitPattern = bitPattern | bit
-            }
-        }
-        self.init(bitPattern)
+        self.init(integerFromBitsArray(bits) as Byte)
     }
     
     /** array of bits */

+ 24 - 12
CryptoSwift/Generics.swift

@@ -8,18 +8,30 @@
 
 import Foundation
 
-//FIXME: I can't do this Generic since Beta7, fix it if you can
-///** build bit pattern from array of bits */
-//func integerFromBitsArray<T : UnsignedIntegerType>(bits: [Bit]) -> T {
-//    var bitPattern:T = 0
-//    for (idx,b) in enumerate(bits) {
-//        if (b == Bit.One) {
-//            let bit = (UInt(1) << UInt(idx)) as T
-//            bitPattern = bitPattern | bit
-//        }
-//    }
-//    return bitPattern
-//}
+/** Protocol and extensions for integerFromBitsArray. Bit hakish for me, but I can't do it in any other way */
+protocol Initiable  {
+    init(_ v: Int)
+}
+
+extension UInt:Initiable {}
+extension UInt:Initiable {}
+extension UInt8:Initiable {}
+extension UInt16:Initiable {}
+extension UInt32:Initiable {}
+extension UInt64:Initiable {}
+
+/** build bit pattern from array of bits */
+func integerFromBitsArray<T: UnsignedIntegerType where T: IntegerLiteralConvertible, T: Initiable>(bits: [Bit]) -> T
+{
+    var bitPattern:T = 0
+    for (idx,b) in enumerate(bits) {
+        if (b == Bit.One) {
+            let bit = T(1 << idx)
+            bitPattern = bitPattern | bit
+        }
+    }
+    return bitPattern
+}
 
 /** initialize integer from array of bytes */
 func integerWithBytes<T: IntegerType>(bytes: [Byte]) -> T {

+ 6 - 7
CryptoSwift/IntExtension.swift

@@ -16,13 +16,12 @@
 
 import Foundation
 
-//FIXME: see integerFromBitsArray
-///* array of bits */
-//extension Int {
-//    init(bits: [Bit]) {
-//        self.init(bitPattern: integerFromBitsArray(bits) as UInt)
-//    }
-//}
+/* array of bits */
+extension Int {
+    init(bits: [Bit]) {
+        self.init(bitPattern: integerFromBitsArray(bits) as UInt)
+    }
+}
 
 /* array of bytes */
 extension Int {

+ 24 - 0
CryptoSwift/Playground/MyPlayground.playground/section-1.swift

@@ -1,3 +1,27 @@
 // Playground - noun: a place where people can play
 
 import Foundation
+
+protocol Initiable  {
+    init(_ v: Int)
+}
+
+func integerFromBitsArray<T: IntegerLiteralConvertible where T: UnsignedIntegerType, T: Initiable>(bits: [Bit]) -> T
+{
+    var bitPattern:T = 0
+    for (idx,b) in enumerate(bits) {
+        if (b == Bit.One) {
+            let bit = T(1 << idx)
+            bitPattern = bitPattern | bit
+        }
+    }
+    return bitPattern
+}
+
+extension UInt:Initiable {}
+extension UInt8:Initiable {}
+extension UInt16:Initiable {}
+extension UInt32:Initiable {}
+extension UInt64:Initiable {}
+
+let i = integerFromBitsArray([Bit.One, Bit.Zero]) as UInt8