[swift-evolution] [Pitch] BitPatternRepresentable

Jens Persson jens at bitcycle.com
Tue Jul 11 06:57:22 CDT 2017


I've found it practical/necessary to write my own BitPatternRepresentable
protocol and IMHO it feels like something that could have been added along
with the improved numeric protocols of Swift 4.

Would it make sense to add something like the following to the standard
library?

/// A type that can be converted to and from an associated BitPattern type.
protocol BitPatternRepresentable {
    associatedtype BitPattern
    var bitPattern: BitPattern { get }
    init(bitPattern: BitPattern)
}

I think it's preferable to keep the conforming type's BitPatterns to the
most basic (most "BitPattern-like" types) so eg
UInt8, UInt16, UInt32, UInt64
rather than
Int8, Int16, Int32, Int64
and, depending on platform
UInt64, UInt32
rather than
Int or UInt.

PS

// Double and Float already fulfill the requirements of
BitPatternRepresentable so:

extension Double : BitPatternRepresentable {}
extension Float : BitPatternRepresentable {}

// And here is the rest of the types that I've used:

extension UInt8 : BitPatternRepresentable {
    var bitPattern: UInt8 { return self }
    init(bitPattern: UInt8) { self = bitPattern }
}
extension UInt16 : BitPatternRepresentable {
    var bitPattern: UInt16 { return self }
    init(bitPattern: UInt16) { self = bitPattern }
}
extension UInt32 : BitPatternRepresentable {
    var bitPattern: UInt32 { return self }
    init(bitPattern: UInt32) { self = bitPattern }
}
extension UInt64 : BitPatternRepresentable {
    var bitPattern: UInt64 { return self }
    init(bitPattern: UInt64) { self = bitPattern }
}
#if arch(x86_64) || arch(arm64)
    extension Int : BitPatternRepresentable {
        var bitPattern: UInt64 { return UInt64(UInt.init(bitPattern: self))
}
        init(bitPattern: UInt64) { self = Int(Int64(bitPattern:
bitPattern)) }
    }
    extension UInt : BitPatternRepresentable {
        var bitPattern: UInt64 { return UInt64(self) }
        init(bitPattern: UInt64) { self = UInt(bitPattern) }
    }
#elseif arch(i386) || arch(arm)
    extension Int : BitPatternRepresentable {
        var bitPattern: UInt32 { return UInt32(UInt.init(bitPattern: self))
}
        init(bitPattern: UInt32) { self = Int(Int32(bitPattern:
bitPattern)) }
    }
    extension UInt : BitPatternRepresentable {
        var bitPattern: UInt32 { return UInt32(self) }
        init(bitPattern: UInt32) { self = UInt(bitPattern) }
    }
#endif


/Jens
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170711/b09ba064/attachment.html>


More information about the swift-evolution mailing list