[swift-evolution] [Pitch] BitPatternRepresentable

Jens Persson jens at bitcycle.com
Tue Jul 11 07:01:58 CDT 2017


Oh, I forgot the signed IntN types:

extension Int8 : BitPatternRepresentable {
    var bitPattern: UInt8 { return UInt8(bitPattern: self) }
    init(bitPattern: UInt8) { self = Int8(bitPattern: bitPattern) }
}
extension Int16 : BitPatternRepresentable {
    var bitPattern: UInt16 { return UInt16(bitPattern: self) }
    init(bitPattern: UInt16) { self = Int16(bitPattern: bitPattern) }
}
extension Int32 : BitPatternRepresentable {
    var bitPattern: UInt32 { return UInt32(bitPattern: self) }
    init(bitPattern: UInt32) { self = Int32(bitPattern: bitPattern) }
}
extension Int64 : BitPatternRepresentable {
    var bitPattern: UInt64 { return UInt64(bitPattern: self) }
    init(bitPattern: UInt64) { self = Int64(bitPattern: bitPattern) }
}


On Tue, Jul 11, 2017 at 1:57 PM, Jens Persson <jens at bitcycle.com> wrote:

> 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/19a8cb7a/attachment.html>


More information about the swift-evolution mailing list