-
Notifications
You must be signed in to change notification settings - Fork 3
/
NBKUnsignedInteger.swift
112 lines (105 loc) · 6.84 KB
/
NBKUnsignedInteger.swift
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
//=----------------------------------------------------------------------------=
// This source file is part of the Numberick open source project.
//
// Copyright (c) 2023 Oscar Byström Ericsson
// Licensed under Apache License, Version 2.0
//
// See http://www.apache.org/licenses/LICENSE-2.0 for license information.
//=----------------------------------------------------------------------------=
//*============================================================================*
// MARK: * NBK x Unsigned Integer
//*============================================================================*
/// An unsigned, binary, integer.
///
/// ### Two's Complement
///
/// Like `BinaryInteger`, it has un/signed [two's complement][2s] semantics.
///
/// ```
/// The two's complement representation of 0 is an infinite sequence of 0s.
/// The two's complement representation of -1 is an infinite sequence of 1s.
/// ```
///
/// [2s]: https://en.wikipedia.org/wiki/Two%27s_complement
///
public protocol NBKUnsignedInteger: NBKBinaryInteger, UnsignedInteger where Digit: NBKUnsignedInteger, Magnitude == Self {
//=------------------------------------------------------------------------=
// MARK: Transformations
//=------------------------------------------------------------------------=
/// Forms the `difference` of `self` and `other`, and returns an `overflow` indicator.
///
/// ```
/// ┌────────────┬─────────── → ───────────┬──────────┐
/// │ self │ other │ difference │ overflow │
/// ├────────────┼─────────── → ───────────┤──────────┤
/// │ Int256( 1) │ Int256( 4) │ Int256(-3) │ false │
/// │ Int256( 2) │ Int256(-3) │ Int256( 5) │ false │
/// │ Int256(-3) │ Int256( 2) │ Int256(-5) │ false │
/// │ Int256(-4) │ Int256(-1) │ Int256(-3) │ false │
/// │────────────┤─────────── → ───────────┤──────────┤
/// │ Int256.max │ Int256(-1) │ Int256.min │ true │
/// │ Int256.min │ Int256( 1) │ Int256.max │ true │
/// └────────────┴─────────── → ───────────┴──────────┘
/// ```
///
/// - Note: In the case of `overflow`, the result is truncated.
///
@inlinable mutating func subtractReportingOverflow(_ other: Self) -> Bool
/// Forms the `difference` of `self` and `other`, and returns an `overflow` indicator.
///
/// ```
/// ┌────────────┬─────────── → ───────────┬──────────┐
/// │ self │ other │ difference │ overflow │
/// ├────────────┼─────────── → ───────────┤──────────┤
/// │ Int256( 1) │ Int( 4) │ Int256(-3) │ false │
/// │ Int256( 2) │ Int( -3) │ Int256( 5) │ false │
/// │ Int256(-3) │ Int( 2) │ Int256(-5) │ false │
/// │ Int256(-4) │ Int( -1) │ Int256(-3) │ false │
/// │────────────┤─────────── → ───────────┤──────────┤
/// │ Int256.max │ Int( -1) │ Int256.min │ true │
/// │ Int256.min │ Int( 1) │ Int256.max │ true │
/// └────────────┴─────────── → ───────────┴──────────┘
/// ```
///
/// - Note: In the case of `overflow`, the result is truncated.
///
@_disfavoredOverload @inlinable mutating func subtractReportingOverflow(_ other: Digit) -> Bool
/// Returns the `difference` of `self` and `other`, along with an `overflow` indicator.
///
/// ```
/// ┌────────────┬─────────── → ───────────┬──────────┐
/// │ self │ other │ difference │ overflow │
/// ├────────────┼─────────── → ───────────┤──────────┤
/// │ Int256( 1) │ Int256( 4) │ Int256(-3) │ false │
/// │ Int256( 2) │ Int256(-3) │ Int256( 5) │ false │
/// │ Int256(-3) │ Int256( 2) │ Int256(-5) │ false │
/// │ Int256(-4) │ Int256(-1) │ Int256(-3) │ false │
/// │────────────┤─────────── → ───────────┤──────────┤
/// │ Int256.max │ Int256(-1) │ Int256.min │ true │
/// │ Int256.min │ Int256( 1) │ Int256.max │ true │
/// └────────────┴─────────── → ───────────┴──────────┘
/// ```
///
/// - Note: In the case of `overflow`, the result is truncated.
///
@inlinable func subtractingReportingOverflow(_ other: Self) -> PVO<Self>
/// Returns the `difference` of `self` and `other`, along with an `overflow` indicator.
///
/// ```
/// ┌────────────┬─────────── → ───────────┬──────────┐
/// │ self │ other │ difference │ overflow │
/// ├────────────┼─────────── → ───────────┤──────────┤
/// │ Int256( 1) │ Int( 4) │ Int256(-3) │ false │
/// │ Int256( 2) │ Int( -3) │ Int256( 5) │ false │
/// │ Int256(-3) │ Int( 2) │ Int256(-5) │ false │
/// │ Int256(-4) │ Int( -1) │ Int256(-3) │ false │
/// │────────────┤─────────── → ───────────┤──────────┤
/// │ Int256.max │ Int( -1) │ Int256.min │ true │
/// │ Int256.min │ Int( 1) │ Int256.max │ true │
/// └────────────┴─────────── → ───────────┴──────────┘
/// ```
///
/// - Note: In the case of `overflow`, the result is truncated.
///
@_disfavoredOverload @inlinable func subtractingReportingOverflow(_ other: Digit) -> PVO<Self>
}