Half way done with the generalized solution. Tests are green. And I am proud.

Signed-off-by: Adam Rocska <adam.rocska@adams.solutions>
This commit is contained in:
Adam Rocska 2020-04-30 19:45:21 +02:00
parent c349a08525
commit 927efa97f7
1 changed files with 20 additions and 15 deletions

View File

@ -19,22 +19,27 @@ struct ControlByte {
return nil return nil
} }
let payloadSizeDefinition = firstByte & 0b0001_1111
if payloadSizeDefinition < 29 {
payloadSize = UInt32(payloadSizeDefinition)
} else {
let numberOfAdditionalBytesToRead = Int(payloadSizeDefinition & 0b0000_0011)
let lastIndexOfBytes = bytes.index(before: bytes.endIndex)
let sliceFrom = bytes.index( let sliceFrom = bytes.index(
bytes.startIndex, bytes.startIndex,
offsetBy: isExtendedType ? 2 : 1, offsetBy: isExtendedType ? 2 : 1,
limitedBy: bytes.endIndex limitedBy: lastIndexOfBytes
) ?? bytes.startIndex ) ?? lastIndexOfBytes
let sliceTo = bytes.index(
let bytesAfterTypeSpecifyingBytes = bytes[sliceFrom...] sliceFrom,
offsetBy: numberOfAdditionalBytesToRead,
let payloadSizeDefinition = firstByte & 0b0001_1111 limitedBy: lastIndexOfBytes
switch payloadSizeDefinition { ) ?? lastIndexOfBytes
case _ where payloadSizeDefinition < 29: let bytesAfterTypeSpecifyingBytes = bytes[sliceFrom...sliceTo]
payloadSize = UInt32(payloadSizeDefinition) let payloadSizeWholeBytes: Data = bytesAfterTypeSpecifyingBytes + Data(
case 29: count: 4 - bytesAfterTypeSpecifyingBytes.count
payloadSize = 29 + UInt32(bytesAfterTypeSpecifyingBytes.first ?? 0) )
default: payloadSize = 29 + payloadSizeWholeBytes.withUnsafeBytes { $0.load(as: UInt32.self) }
return nil
} }
self.type = type self.type = type