File: IntegerTypes.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (114 lines) | stat: -rw-r--r-- 2,787 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// MARK: _UInt24

/// A 24-bit unsigned integer value type.
@usableFromInline
struct _UInt24 {
    @usableFromInline var _backing: (UInt16, UInt8)

    @inlinable
    init(_ value: UInt32) {
        assert(value & 0xff_00_00_00 == 0, "value \(value) too large for _UInt24")
        self._backing = IntegerBitPacking.unpackUInt16UInt8(value)
    }

    static let bitWidth: Int = 24

    @usableFromInline
    static let max: _UInt24 = .init((UInt32(1) << 24) - 1)

    @usableFromInline
    static let min: _UInt24 = .init(0)
}

extension UInt32 {
    @inlinable
    init(_ value: _UInt24) {
        self = IntegerBitPacking.packUInt16UInt8(value._backing.0, value._backing.1)
    }
}

extension Int {
    @inlinable
    init(_ value: _UInt24) {
        self = Int(UInt32(value))
    }
}


extension _UInt24: Equatable {
    @inlinable
    public static func ==(lhs: _UInt24, rhs: _UInt24) -> Bool {
        return lhs._backing == rhs._backing
    }
}

extension _UInt24: CustomStringConvertible {
    @usableFromInline
    var description: String {
        return UInt32(self).description
    }
}

// MARK: _UInt56

/// A 56-bit unsigned integer value type.
struct _UInt56 {
    @usableFromInline var _backing: (UInt32, UInt16, UInt8)

    @inlinable init(_ value: UInt64) {
        self._backing = IntegerBitPacking.unpackUInt32UInt16UInt8(value)
    }

    static let bitWidth: Int = 56

    private static let initializeUInt64 : UInt64 = (1 << 56) - 1
    static let max: _UInt56 = .init(initializeUInt64)
    static let min: _UInt56 = .init(0)
}

extension _UInt56 {
    init(_ value: Int) {
        self.init(UInt64(value))
    }
}

extension UInt64 {
    init(_ value: _UInt56) {
        self = IntegerBitPacking.packUInt32UInt16UInt8(value._backing.0,
                                                       value._backing.1,
                                                       value._backing.2)
    }
}

extension Int {
    init(_ value: _UInt56) {
        self = Int(UInt64(value))
    }
}

extension _UInt56: Equatable {
    @inlinable
    public static func ==(lhs: _UInt56, rhs: _UInt56) -> Bool {
        return lhs._backing == rhs._backing
    }
}

extension _UInt56: CustomStringConvertible {
    var description: String {
        return UInt64(self).description
    }
}