Skip to content

Commit 1ef853d

Browse files
bubskikevints
authored andcommitted
Decimal : Codable implemented
1 parent 62aa8a6 commit 1ef853d

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

Foundation/NSDecimal.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,3 +2087,58 @@ extension Scanner {
20872087
return result
20882088
}
20892089
}
2090+
2091+
extension Decimal : Codable {
2092+
private enum CodingKeys : Int, CodingKey {
2093+
case exponent
2094+
case length
2095+
case isNegative
2096+
case isCompact
2097+
case mantissa
2098+
}
2099+
2100+
public init(from decoder: Decoder) throws {
2101+
let container = try decoder.container(keyedBy: CodingKeys.self)
2102+
let exponent = try container.decode(CInt.self, forKey: .exponent)
2103+
let length = try container.decode(CUnsignedInt.self, forKey: .length)
2104+
let isNegative = try container.decode(Bool.self, forKey: .isNegative)
2105+
let isCompact = try container.decode(Bool.self, forKey: .isCompact)
2106+
2107+
var mantissaContainer = try container.nestedUnkeyedContainer(forKey: .mantissa)
2108+
var mantissa: (CUnsignedShort, CUnsignedShort, CUnsignedShort, CUnsignedShort,
2109+
CUnsignedShort, CUnsignedShort, CUnsignedShort, CUnsignedShort) = (0,0,0,0,0,0,0,0)
2110+
mantissa.0 = try mantissaContainer.decode(CUnsignedShort.self)
2111+
mantissa.1 = try mantissaContainer.decode(CUnsignedShort.self)
2112+
mantissa.2 = try mantissaContainer.decode(CUnsignedShort.self)
2113+
mantissa.3 = try mantissaContainer.decode(CUnsignedShort.self)
2114+
mantissa.4 = try mantissaContainer.decode(CUnsignedShort.self)
2115+
mantissa.5 = try mantissaContainer.decode(CUnsignedShort.self)
2116+
mantissa.6 = try mantissaContainer.decode(CUnsignedShort.self)
2117+
mantissa.7 = try mantissaContainer.decode(CUnsignedShort.self)
2118+
2119+
self.init(_exponent: exponent,
2120+
_length: length,
2121+
_isNegative: CUnsignedInt(isNegative ? 1 : 0),
2122+
_isCompact: CUnsignedInt(isCompact ? 1 : 0),
2123+
_reserved: 0,
2124+
_mantissa: mantissa)
2125+
}
2126+
2127+
public func encode(to encoder: Encoder) throws {
2128+
var container = encoder.container(keyedBy: CodingKeys.self)
2129+
try container.encode(_exponent, forKey: .exponent)
2130+
try container.encode(_length, forKey: .length)
2131+
try container.encode(_isNegative == 0 ? false : true, forKey: .isNegative)
2132+
try container.encode(_isCompact == 0 ? false : true, forKey: .isCompact)
2133+
2134+
var mantissaContainer = container.nestedUnkeyedContainer(forKey: .mantissa)
2135+
try mantissaContainer.encode(_mantissa.0)
2136+
try mantissaContainer.encode(_mantissa.1)
2137+
try mantissaContainer.encode(_mantissa.2)
2138+
try mantissaContainer.encode(_mantissa.3)
2139+
try mantissaContainer.encode(_mantissa.4)
2140+
try mantissaContainer.encode(_mantissa.5)
2141+
try mantissaContainer.encode(_mantissa.6)
2142+
try mantissaContainer.encode(_mantissa.7)
2143+
}
2144+
}

TestFoundation/TestCodable.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,22 @@ class TestCodable : XCTestCase {
205205
}
206206
}
207207

208+
// MARK: - Decimal
209+
lazy var decimalValues: [Decimal] = [
210+
Decimal.leastFiniteMagnitude,
211+
Decimal.greatestFiniteMagnitude,
212+
Decimal.leastNormalMagnitude,
213+
Decimal.leastNonzeroMagnitude,
214+
Decimal.pi,
215+
Decimal()
216+
]
217+
218+
func test_Decimal_JSON() {
219+
for decimal in decimalValues {
220+
expectRoundTripEqualityThroughJSON(for: decimal)
221+
}
222+
}
223+
208224
}
209225

210226
extension TestCodable {
@@ -218,6 +234,7 @@ extension TestCodable {
218234
("test_IndexSet_JSON", test_IndexSet_JSON),
219235
("test_IndexPath_JSON", test_IndexPath_JSON),
220236
("test_AffineTransform_JSON", test_AffineTransform_JSON),
237+
("test_Decimal_JSON", test_Decimal_JSON),
221238
]
222239
}
223240
}

0 commit comments

Comments
 (0)