Coverage Report

Created: 2026-10-13 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/swift-nio/Sources/NIOCore/ByteBuffer-multi-int.swift
Line
Count
Source
1
//===----------------------------------------------------------------------===//
2
//
3
// This source file is part of the SwiftNIO open source project
4
//
5
// Copyright (c) 2021 Apple Inc. and the SwiftNIO project authors
6
// Licensed under Apache License v2.0
7
//
8
// See LICENSE.txt for license information
9
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
10
//
11
// SPDX-License-Identifier: Apache-2.0
12
//
13
//===----------------------------------------------------------------------===//
14
15
/// NOTE: THIS FILE IS AUTO-GENERATED BY dev/generate-bytebuffer-multi-int.sh
16
17
extension ByteBuffer {
18
    @inlinable
19
    @_alwaysEmitIntoClient
20
    public mutating func readMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger>(
21
        endianness: Endianness = .big,
22
        as: (T1, T2).Type = (T1, T2).self
23
0
    ) -> (T1, T2)? {
24
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
25
0
            return nil
26
0
        }
27
0
        var bytesRequired: Int = MemoryLayout<T1>.size
28
0
        bytesRequired &+= MemoryLayout<T2>.size
29
0
        self._moveReaderIndex(forwardBy: bytesRequired)
30
0
        return result
31
0
    }
32
33
    @inlinable
34
    @_alwaysEmitIntoClient
35
    public func peekMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger>(
36
        endianness: Endianness = .big,
37
        as: (T1, T2).Type = (T1, T2).self
38
0
    ) -> (T1, T2)? {
39
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
40
0
    }
41
42
    @inlinable
43
    @_alwaysEmitIntoClient
44
    public func getMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger>(
45
        at index: Int,
46
        endianness: Endianness = .big,
47
        as: (T1, T2).Type = (T1, T2).self
48
0
    ) -> (T1, T2)? {
49
0
        var bytesRequired: Int = MemoryLayout<T1>.size
50
0
        bytesRequired &+= MemoryLayout<T2>.size
51
0
52
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
53
0
            return nil
54
0
        }
55
0
56
0
        var v1: T1 = 0
57
0
        var v2: T2 = 0
58
0
        var offset = range.lowerBound
59
0
        self.withUnsafeReadableBytes { ptr in
60
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
61
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
62
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
63
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
64
0
            }
65
0
            offset = offset &+ MemoryLayout<T1>.size
66
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
67
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
68
0
            }
69
0
            offset = offset &+ MemoryLayout<T2>.size
70
0
            assert(offset == range.upperBound)
71
0
        }
72
0
        switch endianness {
73
0
        case .big:
74
0
            return (T1(bigEndian: v1), T2(bigEndian: v2))
75
0
        case .little:
76
0
            return (T1(littleEndian: v1), T2(littleEndian: v2))
77
0
        }
78
0
    }
79
80
    @inlinable
81
    @_alwaysEmitIntoClient
82
    @discardableResult
83
    public mutating func writeMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger>(
84
        _ value1: T1,
85
        _ value2: T2,
86
        endianness: Endianness = .big,
87
        as: (T1, T2).Type = (T1, T2).self
88
0
    ) -> Int {
89
0
        let bytesWritten = self.setMultipleIntegers(
90
0
            value1,
91
0
            value2,
92
0
            at: self.writerIndex,
93
0
            endianness: endianness,
94
0
            as: `as`
95
0
        )
96
0
        self._moveWriterIndex(forwardBy: bytesWritten)
97
0
        return bytesWritten
98
0
    }
99
100
    @inlinable
101
    @_alwaysEmitIntoClient
102
    @discardableResult
103
    public mutating func setMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger>(
104
        _ value1: T1,
105
        _ value2: T2,
106
        at index: Int,
107
        endianness: Endianness = .big,
108
        as: (T1, T2).Type = (T1, T2).self
109
0
    ) -> Int {
110
0
        var v1: T1
111
0
        var v2: T2
112
0
        switch endianness {
113
0
        case .big:
114
0
            v1 = value1.bigEndian
115
0
            v2 = value2.bigEndian
116
0
        case .little:
117
0
            v1 = value1.littleEndian
118
0
            v2 = value2.littleEndian
119
0
        }
120
0
121
0
        var offset = index
122
0
        var bytesWritten = 0
123
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
124
0
        offset = offset &+ MemoryLayout<T1>.size
125
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
126
0
        offset = offset &+ MemoryLayout<T2>.size
127
0
        return bytesWritten
128
0
    }
129
130
    @inlinable
131
    @_alwaysEmitIntoClient
132
    public mutating func readMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger, T3: FixedWidthInteger>(
133
        endianness: Endianness = .big,
134
        as: (T1, T2, T3).Type = (T1, T2, T3).self
135
0
    ) -> (T1, T2, T3)? {
136
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
137
0
            return nil
138
0
        }
139
0
        var bytesRequired: Int = MemoryLayout<T1>.size
140
0
        bytesRequired &+= MemoryLayout<T2>.size
141
0
        bytesRequired &+= MemoryLayout<T3>.size
142
0
        self._moveReaderIndex(forwardBy: bytesRequired)
143
0
        return result
144
0
    }
145
146
    @inlinable
147
    @_alwaysEmitIntoClient
148
    public func peekMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger, T3: FixedWidthInteger>(
149
        endianness: Endianness = .big,
150
        as: (T1, T2, T3).Type = (T1, T2, T3).self
151
0
    ) -> (T1, T2, T3)? {
152
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
153
0
    }
154
155
    @inlinable
156
    @_alwaysEmitIntoClient
157
    public func getMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger, T3: FixedWidthInteger>(
158
        at index: Int,
159
        endianness: Endianness = .big,
160
        as: (T1, T2, T3).Type = (T1, T2, T3).self
161
0
    ) -> (T1, T2, T3)? {
162
0
        var bytesRequired: Int = MemoryLayout<T1>.size
163
0
        bytesRequired &+= MemoryLayout<T2>.size
164
0
        bytesRequired &+= MemoryLayout<T3>.size
165
0
166
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
167
0
            return nil
168
0
        }
169
0
170
0
        var v1: T1 = 0
171
0
        var v2: T2 = 0
172
0
        var v3: T3 = 0
173
0
        var offset = range.lowerBound
174
0
        self.withUnsafeReadableBytes { ptr in
175
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
176
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
177
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
178
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
179
0
            }
180
0
            offset = offset &+ MemoryLayout<T1>.size
181
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
182
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
183
0
            }
184
0
            offset = offset &+ MemoryLayout<T2>.size
185
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
186
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
187
0
            }
188
0
            offset = offset &+ MemoryLayout<T3>.size
189
0
            assert(offset == range.upperBound)
190
0
        }
191
0
        switch endianness {
192
0
        case .big:
193
0
            return (T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3))
194
0
        case .little:
195
0
            return (T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3))
196
0
        }
197
0
    }
198
199
    @inlinable
200
    @_alwaysEmitIntoClient
201
    @discardableResult
202
    public mutating func writeMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger, T3: FixedWidthInteger>(
203
        _ value1: T1,
204
        _ value2: T2,
205
        _ value3: T3,
206
        endianness: Endianness = .big,
207
        as: (T1, T2, T3).Type = (T1, T2, T3).self
208
0
    ) -> Int {
209
0
        let bytesWritten = self.setMultipleIntegers(
210
0
            value1,
211
0
            value2,
212
0
            value3,
213
0
            at: self.writerIndex,
214
0
            endianness: endianness,
215
0
            as: `as`
216
0
        )
217
0
        self._moveWriterIndex(forwardBy: bytesWritten)
218
0
        return bytesWritten
219
0
    }
220
221
    @inlinable
222
    @_alwaysEmitIntoClient
223
    @discardableResult
224
    public mutating func setMultipleIntegers<T1: FixedWidthInteger, T2: FixedWidthInteger, T3: FixedWidthInteger>(
225
        _ value1: T1,
226
        _ value2: T2,
227
        _ value3: T3,
228
        at index: Int,
229
        endianness: Endianness = .big,
230
        as: (T1, T2, T3).Type = (T1, T2, T3).self
231
0
    ) -> Int {
232
0
        var v1: T1
233
0
        var v2: T2
234
0
        var v3: T3
235
0
        switch endianness {
236
0
        case .big:
237
0
            v1 = value1.bigEndian
238
0
            v2 = value2.bigEndian
239
0
            v3 = value3.bigEndian
240
0
        case .little:
241
0
            v1 = value1.littleEndian
242
0
            v2 = value2.littleEndian
243
0
            v3 = value3.littleEndian
244
0
        }
245
0
246
0
        var offset = index
247
0
        var bytesWritten = 0
248
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
249
0
        offset = offset &+ MemoryLayout<T1>.size
250
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
251
0
        offset = offset &+ MemoryLayout<T2>.size
252
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
253
0
        offset = offset &+ MemoryLayout<T3>.size
254
0
        return bytesWritten
255
0
    }
256
257
    @inlinable
258
    @_alwaysEmitIntoClient
259
    public mutating func readMultipleIntegers<
260
        T1: FixedWidthInteger,
261
        T2: FixedWidthInteger,
262
        T3: FixedWidthInteger,
263
        T4: FixedWidthInteger
264
0
    >(endianness: Endianness = .big, as: (T1, T2, T3, T4).Type = (T1, T2, T3, T4).self) -> (T1, T2, T3, T4)? {
265
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
266
0
            return nil
267
0
        }
268
0
        var bytesRequired: Int = MemoryLayout<T1>.size
269
0
        bytesRequired &+= MemoryLayout<T2>.size
270
0
        bytesRequired &+= MemoryLayout<T3>.size
271
0
        bytesRequired &+= MemoryLayout<T4>.size
272
0
        self._moveReaderIndex(forwardBy: bytesRequired)
273
0
        return result
274
0
    }
275
276
    @inlinable
277
    @_alwaysEmitIntoClient
278
    public func peekMultipleIntegers<
279
        T1: FixedWidthInteger,
280
        T2: FixedWidthInteger,
281
        T3: FixedWidthInteger,
282
        T4: FixedWidthInteger
283
0
    >(endianness: Endianness = .big, as: (T1, T2, T3, T4).Type = (T1, T2, T3, T4).self) -> (T1, T2, T3, T4)? {
284
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
285
0
    }
286
287
    @inlinable
288
    @_alwaysEmitIntoClient
289
    public func getMultipleIntegers<
290
        T1: FixedWidthInteger,
291
        T2: FixedWidthInteger,
292
        T3: FixedWidthInteger,
293
        T4: FixedWidthInteger
294
    >(
295
        at index: Int,
296
        endianness: Endianness = .big,
297
        as: (T1, T2, T3, T4).Type = (T1, T2, T3, T4).self
298
0
    ) -> (T1, T2, T3, T4)? {
299
0
        var bytesRequired: Int = MemoryLayout<T1>.size
300
0
        bytesRequired &+= MemoryLayout<T2>.size
301
0
        bytesRequired &+= MemoryLayout<T3>.size
302
0
        bytesRequired &+= MemoryLayout<T4>.size
303
0
304
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
305
0
            return nil
306
0
        }
307
0
308
0
        var v1: T1 = 0
309
0
        var v2: T2 = 0
310
0
        var v3: T3 = 0
311
0
        var v4: T4 = 0
312
0
        var offset = range.lowerBound
313
0
        self.withUnsafeReadableBytes { ptr in
314
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
315
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
316
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
317
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
318
0
            }
319
0
            offset = offset &+ MemoryLayout<T1>.size
320
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
321
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
322
0
            }
323
0
            offset = offset &+ MemoryLayout<T2>.size
324
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
325
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
326
0
            }
327
0
            offset = offset &+ MemoryLayout<T3>.size
328
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
329
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
330
0
            }
331
0
            offset = offset &+ MemoryLayout<T4>.size
332
0
            assert(offset == range.upperBound)
333
0
        }
334
0
        switch endianness {
335
0
        case .big:
336
0
            return (T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4))
337
0
        case .little:
338
0
            return (T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4))
339
0
        }
340
0
    }
341
342
    @inlinable
343
    @_alwaysEmitIntoClient
344
    @discardableResult
345
    public mutating func writeMultipleIntegers<
346
        T1: FixedWidthInteger,
347
        T2: FixedWidthInteger,
348
        T3: FixedWidthInteger,
349
        T4: FixedWidthInteger
350
    >(
351
        _ value1: T1,
352
        _ value2: T2,
353
        _ value3: T3,
354
        _ value4: T4,
355
        endianness: Endianness = .big,
356
        as: (T1, T2, T3, T4).Type = (T1, T2, T3, T4).self
357
0
    ) -> Int {
358
0
        let bytesWritten = self.setMultipleIntegers(
359
0
            value1,
360
0
            value2,
361
0
            value3,
362
0
            value4,
363
0
            at: self.writerIndex,
364
0
            endianness: endianness,
365
0
            as: `as`
366
0
        )
367
0
        self._moveWriterIndex(forwardBy: bytesWritten)
368
0
        return bytesWritten
369
0
    }
370
371
    @inlinable
372
    @_alwaysEmitIntoClient
373
    @discardableResult
374
    public mutating func setMultipleIntegers<
375
        T1: FixedWidthInteger,
376
        T2: FixedWidthInteger,
377
        T3: FixedWidthInteger,
378
        T4: FixedWidthInteger
379
    >(
380
        _ value1: T1,
381
        _ value2: T2,
382
        _ value3: T3,
383
        _ value4: T4,
384
        at index: Int,
385
        endianness: Endianness = .big,
386
        as: (T1, T2, T3, T4).Type = (T1, T2, T3, T4).self
387
0
    ) -> Int {
388
0
        var v1: T1
389
0
        var v2: T2
390
0
        var v3: T3
391
0
        var v4: T4
392
0
        switch endianness {
393
0
        case .big:
394
0
            v1 = value1.bigEndian
395
0
            v2 = value2.bigEndian
396
0
            v3 = value3.bigEndian
397
0
            v4 = value4.bigEndian
398
0
        case .little:
399
0
            v1 = value1.littleEndian
400
0
            v2 = value2.littleEndian
401
0
            v3 = value3.littleEndian
402
0
            v4 = value4.littleEndian
403
0
        }
404
0
405
0
        var offset = index
406
0
        var bytesWritten = 0
407
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
408
0
        offset = offset &+ MemoryLayout<T1>.size
409
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
410
0
        offset = offset &+ MemoryLayout<T2>.size
411
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
412
0
        offset = offset &+ MemoryLayout<T3>.size
413
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
414
0
        offset = offset &+ MemoryLayout<T4>.size
415
0
        return bytesWritten
416
0
    }
417
418
    @inlinable
419
    @_alwaysEmitIntoClient
420
    public mutating func readMultipleIntegers<
421
        T1: FixedWidthInteger,
422
        T2: FixedWidthInteger,
423
        T3: FixedWidthInteger,
424
        T4: FixedWidthInteger,
425
        T5: FixedWidthInteger
426
    >(endianness: Endianness = .big, as: (T1, T2, T3, T4, T5).Type = (T1, T2, T3, T4, T5).self) -> (T1, T2, T3, T4, T5)?
427
0
    {
428
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
429
0
            return nil
430
0
        }
431
0
        var bytesRequired: Int = MemoryLayout<T1>.size
432
0
        bytesRequired &+= MemoryLayout<T2>.size
433
0
        bytesRequired &+= MemoryLayout<T3>.size
434
0
        bytesRequired &+= MemoryLayout<T4>.size
435
0
        bytesRequired &+= MemoryLayout<T5>.size
436
0
        self._moveReaderIndex(forwardBy: bytesRequired)
437
0
        return result
438
0
    }
439
440
    @inlinable
441
    @_alwaysEmitIntoClient
442
    public func peekMultipleIntegers<
443
        T1: FixedWidthInteger,
444
        T2: FixedWidthInteger,
445
        T3: FixedWidthInteger,
446
        T4: FixedWidthInteger,
447
        T5: FixedWidthInteger
448
    >(endianness: Endianness = .big, as: (T1, T2, T3, T4, T5).Type = (T1, T2, T3, T4, T5).self) -> (T1, T2, T3, T4, T5)?
449
0
    {
450
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
451
0
    }
452
453
    @inlinable
454
    @_alwaysEmitIntoClient
455
    public func getMultipleIntegers<
456
        T1: FixedWidthInteger,
457
        T2: FixedWidthInteger,
458
        T3: FixedWidthInteger,
459
        T4: FixedWidthInteger,
460
        T5: FixedWidthInteger
461
    >(
462
        at index: Int,
463
        endianness: Endianness = .big,
464
        as: (T1, T2, T3, T4, T5).Type = (T1, T2, T3, T4, T5).self
465
0
    ) -> (T1, T2, T3, T4, T5)? {
466
0
        var bytesRequired: Int = MemoryLayout<T1>.size
467
0
        bytesRequired &+= MemoryLayout<T2>.size
468
0
        bytesRequired &+= MemoryLayout<T3>.size
469
0
        bytesRequired &+= MemoryLayout<T4>.size
470
0
        bytesRequired &+= MemoryLayout<T5>.size
471
0
472
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
473
0
            return nil
474
0
        }
475
0
476
0
        var v1: T1 = 0
477
0
        var v2: T2 = 0
478
0
        var v3: T3 = 0
479
0
        var v4: T4 = 0
480
0
        var v5: T5 = 0
481
0
        var offset = range.lowerBound
482
0
        self.withUnsafeReadableBytes { ptr in
483
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
484
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
485
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
486
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
487
0
            }
488
0
            offset = offset &+ MemoryLayout<T1>.size
489
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
490
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
491
0
            }
492
0
            offset = offset &+ MemoryLayout<T2>.size
493
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
494
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
495
0
            }
496
0
            offset = offset &+ MemoryLayout<T3>.size
497
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
498
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
499
0
            }
500
0
            offset = offset &+ MemoryLayout<T4>.size
501
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
502
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
503
0
            }
504
0
            offset = offset &+ MemoryLayout<T5>.size
505
0
            assert(offset == range.upperBound)
506
0
        }
507
0
        switch endianness {
508
0
        case .big:
509
0
            return (T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5))
510
0
        case .little:
511
0
            return (
512
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
513
0
                T5(littleEndian: v5)
514
0
            )
515
0
        }
516
0
    }
517
518
    @inlinable
519
    @_alwaysEmitIntoClient
520
    @discardableResult
521
    public mutating func writeMultipleIntegers<
522
        T1: FixedWidthInteger,
523
        T2: FixedWidthInteger,
524
        T3: FixedWidthInteger,
525
        T4: FixedWidthInteger,
526
        T5: FixedWidthInteger
527
    >(
528
        _ value1: T1,
529
        _ value2: T2,
530
        _ value3: T3,
531
        _ value4: T4,
532
        _ value5: T5,
533
        endianness: Endianness = .big,
534
        as: (T1, T2, T3, T4, T5).Type = (T1, T2, T3, T4, T5).self
535
0
    ) -> Int {
536
0
        let bytesWritten = self.setMultipleIntegers(
537
0
            value1,
538
0
            value2,
539
0
            value3,
540
0
            value4,
541
0
            value5,
542
0
            at: self.writerIndex,
543
0
            endianness: endianness,
544
0
            as: `as`
545
0
        )
546
0
        self._moveWriterIndex(forwardBy: bytesWritten)
547
0
        return bytesWritten
548
0
    }
549
550
    @inlinable
551
    @_alwaysEmitIntoClient
552
    @discardableResult
553
    public mutating func setMultipleIntegers<
554
        T1: FixedWidthInteger,
555
        T2: FixedWidthInteger,
556
        T3: FixedWidthInteger,
557
        T4: FixedWidthInteger,
558
        T5: FixedWidthInteger
559
    >(
560
        _ value1: T1,
561
        _ value2: T2,
562
        _ value3: T3,
563
        _ value4: T4,
564
        _ value5: T5,
565
        at index: Int,
566
        endianness: Endianness = .big,
567
        as: (T1, T2, T3, T4, T5).Type = (T1, T2, T3, T4, T5).self
568
0
    ) -> Int {
569
0
        var v1: T1
570
0
        var v2: T2
571
0
        var v3: T3
572
0
        var v4: T4
573
0
        var v5: T5
574
0
        switch endianness {
575
0
        case .big:
576
0
            v1 = value1.bigEndian
577
0
            v2 = value2.bigEndian
578
0
            v3 = value3.bigEndian
579
0
            v4 = value4.bigEndian
580
0
            v5 = value5.bigEndian
581
0
        case .little:
582
0
            v1 = value1.littleEndian
583
0
            v2 = value2.littleEndian
584
0
            v3 = value3.littleEndian
585
0
            v4 = value4.littleEndian
586
0
            v5 = value5.littleEndian
587
0
        }
588
0
589
0
        var offset = index
590
0
        var bytesWritten = 0
591
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
592
0
        offset = offset &+ MemoryLayout<T1>.size
593
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
594
0
        offset = offset &+ MemoryLayout<T2>.size
595
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
596
0
        offset = offset &+ MemoryLayout<T3>.size
597
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
598
0
        offset = offset &+ MemoryLayout<T4>.size
599
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
600
0
        offset = offset &+ MemoryLayout<T5>.size
601
0
        return bytesWritten
602
0
    }
603
604
    @inlinable
605
    @_alwaysEmitIntoClient
606
    public mutating func readMultipleIntegers<
607
        T1: FixedWidthInteger,
608
        T2: FixedWidthInteger,
609
        T3: FixedWidthInteger,
610
        T4: FixedWidthInteger,
611
        T5: FixedWidthInteger,
612
        T6: FixedWidthInteger
613
    >(
614
        endianness: Endianness = .big,
615
        as: (T1, T2, T3, T4, T5, T6).Type = (T1, T2, T3, T4, T5, T6).self
616
0
    ) -> (T1, T2, T3, T4, T5, T6)? {
617
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
618
0
            return nil
619
0
        }
620
0
        var bytesRequired: Int = MemoryLayout<T1>.size
621
0
        bytesRequired &+= MemoryLayout<T2>.size
622
0
        bytesRequired &+= MemoryLayout<T3>.size
623
0
        bytesRequired &+= MemoryLayout<T4>.size
624
0
        bytesRequired &+= MemoryLayout<T5>.size
625
0
        bytesRequired &+= MemoryLayout<T6>.size
626
0
        self._moveReaderIndex(forwardBy: bytesRequired)
627
0
        return result
628
0
    }
629
630
    @inlinable
631
    @_alwaysEmitIntoClient
632
    public func peekMultipleIntegers<
633
        T1: FixedWidthInteger,
634
        T2: FixedWidthInteger,
635
        T3: FixedWidthInteger,
636
        T4: FixedWidthInteger,
637
        T5: FixedWidthInteger,
638
        T6: FixedWidthInteger
639
    >(
640
        endianness: Endianness = .big,
641
        as: (T1, T2, T3, T4, T5, T6).Type = (T1, T2, T3, T4, T5, T6).self
642
0
    ) -> (T1, T2, T3, T4, T5, T6)? {
643
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
644
0
    }
645
646
    @inlinable
647
    @_alwaysEmitIntoClient
648
    public func getMultipleIntegers<
649
        T1: FixedWidthInteger,
650
        T2: FixedWidthInteger,
651
        T3: FixedWidthInteger,
652
        T4: FixedWidthInteger,
653
        T5: FixedWidthInteger,
654
        T6: FixedWidthInteger
655
    >(
656
        at index: Int,
657
        endianness: Endianness = .big,
658
        as: (T1, T2, T3, T4, T5, T6).Type = (T1, T2, T3, T4, T5, T6).self
659
0
    ) -> (T1, T2, T3, T4, T5, T6)? {
660
0
        var bytesRequired: Int = MemoryLayout<T1>.size
661
0
        bytesRequired &+= MemoryLayout<T2>.size
662
0
        bytesRequired &+= MemoryLayout<T3>.size
663
0
        bytesRequired &+= MemoryLayout<T4>.size
664
0
        bytesRequired &+= MemoryLayout<T5>.size
665
0
        bytesRequired &+= MemoryLayout<T6>.size
666
0
667
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
668
0
            return nil
669
0
        }
670
0
671
0
        var v1: T1 = 0
672
0
        var v2: T2 = 0
673
0
        var v3: T3 = 0
674
0
        var v4: T4 = 0
675
0
        var v5: T5 = 0
676
0
        var v6: T6 = 0
677
0
        var offset = range.lowerBound
678
0
        self.withUnsafeReadableBytes { ptr in
679
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
680
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
681
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
682
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
683
0
            }
684
0
            offset = offset &+ MemoryLayout<T1>.size
685
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
686
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
687
0
            }
688
0
            offset = offset &+ MemoryLayout<T2>.size
689
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
690
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
691
0
            }
692
0
            offset = offset &+ MemoryLayout<T3>.size
693
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
694
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
695
0
            }
696
0
            offset = offset &+ MemoryLayout<T4>.size
697
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
698
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
699
0
            }
700
0
            offset = offset &+ MemoryLayout<T5>.size
701
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
702
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
703
0
            }
704
0
            offset = offset &+ MemoryLayout<T6>.size
705
0
            assert(offset == range.upperBound)
706
0
        }
707
0
        switch endianness {
708
0
        case .big:
709
0
            return (
710
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
711
0
                T6(bigEndian: v6)
712
0
            )
713
0
        case .little:
714
0
            return (
715
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
716
0
                T5(littleEndian: v5), T6(littleEndian: v6)
717
0
            )
718
0
        }
719
0
    }
720
721
    @inlinable
722
    @_alwaysEmitIntoClient
723
    @discardableResult
724
    public mutating func writeMultipleIntegers<
725
        T1: FixedWidthInteger,
726
        T2: FixedWidthInteger,
727
        T3: FixedWidthInteger,
728
        T4: FixedWidthInteger,
729
        T5: FixedWidthInteger,
730
        T6: FixedWidthInteger
731
    >(
732
        _ value1: T1,
733
        _ value2: T2,
734
        _ value3: T3,
735
        _ value4: T4,
736
        _ value5: T5,
737
        _ value6: T6,
738
        endianness: Endianness = .big,
739
        as: (T1, T2, T3, T4, T5, T6).Type = (T1, T2, T3, T4, T5, T6).self
740
0
    ) -> Int {
741
0
        let bytesWritten = self.setMultipleIntegers(
742
0
            value1,
743
0
            value2,
744
0
            value3,
745
0
            value4,
746
0
            value5,
747
0
            value6,
748
0
            at: self.writerIndex,
749
0
            endianness: endianness,
750
0
            as: `as`
751
0
        )
752
0
        self._moveWriterIndex(forwardBy: bytesWritten)
753
0
        return bytesWritten
754
0
    }
755
756
    @inlinable
757
    @_alwaysEmitIntoClient
758
    @discardableResult
759
    public mutating func setMultipleIntegers<
760
        T1: FixedWidthInteger,
761
        T2: FixedWidthInteger,
762
        T3: FixedWidthInteger,
763
        T4: FixedWidthInteger,
764
        T5: FixedWidthInteger,
765
        T6: FixedWidthInteger
766
    >(
767
        _ value1: T1,
768
        _ value2: T2,
769
        _ value3: T3,
770
        _ value4: T4,
771
        _ value5: T5,
772
        _ value6: T6,
773
        at index: Int,
774
        endianness: Endianness = .big,
775
        as: (T1, T2, T3, T4, T5, T6).Type = (T1, T2, T3, T4, T5, T6).self
776
0
    ) -> Int {
777
0
        var v1: T1
778
0
        var v2: T2
779
0
        var v3: T3
780
0
        var v4: T4
781
0
        var v5: T5
782
0
        var v6: T6
783
0
        switch endianness {
784
0
        case .big:
785
0
            v1 = value1.bigEndian
786
0
            v2 = value2.bigEndian
787
0
            v3 = value3.bigEndian
788
0
            v4 = value4.bigEndian
789
0
            v5 = value5.bigEndian
790
0
            v6 = value6.bigEndian
791
0
        case .little:
792
0
            v1 = value1.littleEndian
793
0
            v2 = value2.littleEndian
794
0
            v3 = value3.littleEndian
795
0
            v4 = value4.littleEndian
796
0
            v5 = value5.littleEndian
797
0
            v6 = value6.littleEndian
798
0
        }
799
0
800
0
        var offset = index
801
0
        var bytesWritten = 0
802
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
803
0
        offset = offset &+ MemoryLayout<T1>.size
804
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
805
0
        offset = offset &+ MemoryLayout<T2>.size
806
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
807
0
        offset = offset &+ MemoryLayout<T3>.size
808
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
809
0
        offset = offset &+ MemoryLayout<T4>.size
810
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
811
0
        offset = offset &+ MemoryLayout<T5>.size
812
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
813
0
        offset = offset &+ MemoryLayout<T6>.size
814
0
        return bytesWritten
815
0
    }
816
817
    @inlinable
818
    @_alwaysEmitIntoClient
819
    public mutating func readMultipleIntegers<
820
        T1: FixedWidthInteger,
821
        T2: FixedWidthInteger,
822
        T3: FixedWidthInteger,
823
        T4: FixedWidthInteger,
824
        T5: FixedWidthInteger,
825
        T6: FixedWidthInteger,
826
        T7: FixedWidthInteger
827
    >(
828
        endianness: Endianness = .big,
829
        as: (T1, T2, T3, T4, T5, T6, T7).Type = (T1, T2, T3, T4, T5, T6, T7).self
830
0
    ) -> (T1, T2, T3, T4, T5, T6, T7)? {
831
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
832
0
            return nil
833
0
        }
834
0
        var bytesRequired: Int = MemoryLayout<T1>.size
835
0
        bytesRequired &+= MemoryLayout<T2>.size
836
0
        bytesRequired &+= MemoryLayout<T3>.size
837
0
        bytesRequired &+= MemoryLayout<T4>.size
838
0
        bytesRequired &+= MemoryLayout<T5>.size
839
0
        bytesRequired &+= MemoryLayout<T6>.size
840
0
        bytesRequired &+= MemoryLayout<T7>.size
841
0
        self._moveReaderIndex(forwardBy: bytesRequired)
842
0
        return result
843
0
    }
844
845
    @inlinable
846
    @_alwaysEmitIntoClient
847
    public func peekMultipleIntegers<
848
        T1: FixedWidthInteger,
849
        T2: FixedWidthInteger,
850
        T3: FixedWidthInteger,
851
        T4: FixedWidthInteger,
852
        T5: FixedWidthInteger,
853
        T6: FixedWidthInteger,
854
        T7: FixedWidthInteger
855
    >(
856
        endianness: Endianness = .big,
857
        as: (T1, T2, T3, T4, T5, T6, T7).Type = (T1, T2, T3, T4, T5, T6, T7).self
858
0
    ) -> (T1, T2, T3, T4, T5, T6, T7)? {
859
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
860
0
    }
861
862
    @inlinable
863
    @_alwaysEmitIntoClient
864
    public func getMultipleIntegers<
865
        T1: FixedWidthInteger,
866
        T2: FixedWidthInteger,
867
        T3: FixedWidthInteger,
868
        T4: FixedWidthInteger,
869
        T5: FixedWidthInteger,
870
        T6: FixedWidthInteger,
871
        T7: FixedWidthInteger
872
    >(
873
        at index: Int,
874
        endianness: Endianness = .big,
875
        as: (T1, T2, T3, T4, T5, T6, T7).Type = (T1, T2, T3, T4, T5, T6, T7).self
876
0
    ) -> (T1, T2, T3, T4, T5, T6, T7)? {
877
0
        var bytesRequired: Int = MemoryLayout<T1>.size
878
0
        bytesRequired &+= MemoryLayout<T2>.size
879
0
        bytesRequired &+= MemoryLayout<T3>.size
880
0
        bytesRequired &+= MemoryLayout<T4>.size
881
0
        bytesRequired &+= MemoryLayout<T5>.size
882
0
        bytesRequired &+= MemoryLayout<T6>.size
883
0
        bytesRequired &+= MemoryLayout<T7>.size
884
0
885
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
886
0
            return nil
887
0
        }
888
0
889
0
        var v1: T1 = 0
890
0
        var v2: T2 = 0
891
0
        var v3: T3 = 0
892
0
        var v4: T4 = 0
893
0
        var v5: T5 = 0
894
0
        var v6: T6 = 0
895
0
        var v7: T7 = 0
896
0
        var offset = range.lowerBound
897
0
        self.withUnsafeReadableBytes { ptr in
898
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
899
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
900
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
901
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
902
0
            }
903
0
            offset = offset &+ MemoryLayout<T1>.size
904
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
905
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
906
0
            }
907
0
            offset = offset &+ MemoryLayout<T2>.size
908
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
909
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
910
0
            }
911
0
            offset = offset &+ MemoryLayout<T3>.size
912
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
913
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
914
0
            }
915
0
            offset = offset &+ MemoryLayout<T4>.size
916
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
917
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
918
0
            }
919
0
            offset = offset &+ MemoryLayout<T5>.size
920
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
921
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
922
0
            }
923
0
            offset = offset &+ MemoryLayout<T6>.size
924
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
925
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
926
0
            }
927
0
            offset = offset &+ MemoryLayout<T7>.size
928
0
            assert(offset == range.upperBound)
929
0
        }
930
0
        switch endianness {
931
0
        case .big:
932
0
            return (
933
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
934
0
                T6(bigEndian: v6), T7(bigEndian: v7)
935
0
            )
936
0
        case .little:
937
0
            return (
938
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
939
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7)
940
0
            )
941
0
        }
942
0
    }
943
944
    @inlinable
945
    @_alwaysEmitIntoClient
946
    @discardableResult
947
    public mutating func writeMultipleIntegers<
948
        T1: FixedWidthInteger,
949
        T2: FixedWidthInteger,
950
        T3: FixedWidthInteger,
951
        T4: FixedWidthInteger,
952
        T5: FixedWidthInteger,
953
        T6: FixedWidthInteger,
954
        T7: FixedWidthInteger
955
    >(
956
        _ value1: T1,
957
        _ value2: T2,
958
        _ value3: T3,
959
        _ value4: T4,
960
        _ value5: T5,
961
        _ value6: T6,
962
        _ value7: T7,
963
        endianness: Endianness = .big,
964
        as: (T1, T2, T3, T4, T5, T6, T7).Type = (T1, T2, T3, T4, T5, T6, T7).self
965
0
    ) -> Int {
966
0
        let bytesWritten = self.setMultipleIntegers(
967
0
            value1,
968
0
            value2,
969
0
            value3,
970
0
            value4,
971
0
            value5,
972
0
            value6,
973
0
            value7,
974
0
            at: self.writerIndex,
975
0
            endianness: endianness,
976
0
            as: `as`
977
0
        )
978
0
        self._moveWriterIndex(forwardBy: bytesWritten)
979
0
        return bytesWritten
980
0
    }
981
982
    @inlinable
983
    @_alwaysEmitIntoClient
984
    @discardableResult
985
    public mutating func setMultipleIntegers<
986
        T1: FixedWidthInteger,
987
        T2: FixedWidthInteger,
988
        T3: FixedWidthInteger,
989
        T4: FixedWidthInteger,
990
        T5: FixedWidthInteger,
991
        T6: FixedWidthInteger,
992
        T7: FixedWidthInteger
993
    >(
994
        _ value1: T1,
995
        _ value2: T2,
996
        _ value3: T3,
997
        _ value4: T4,
998
        _ value5: T5,
999
        _ value6: T6,
1000
        _ value7: T7,
1001
        at index: Int,
1002
        endianness: Endianness = .big,
1003
        as: (T1, T2, T3, T4, T5, T6, T7).Type = (T1, T2, T3, T4, T5, T6, T7).self
1004
0
    ) -> Int {
1005
0
        var v1: T1
1006
0
        var v2: T2
1007
0
        var v3: T3
1008
0
        var v4: T4
1009
0
        var v5: T5
1010
0
        var v6: T6
1011
0
        var v7: T7
1012
0
        switch endianness {
1013
0
        case .big:
1014
0
            v1 = value1.bigEndian
1015
0
            v2 = value2.bigEndian
1016
0
            v3 = value3.bigEndian
1017
0
            v4 = value4.bigEndian
1018
0
            v5 = value5.bigEndian
1019
0
            v6 = value6.bigEndian
1020
0
            v7 = value7.bigEndian
1021
0
        case .little:
1022
0
            v1 = value1.littleEndian
1023
0
            v2 = value2.littleEndian
1024
0
            v3 = value3.littleEndian
1025
0
            v4 = value4.littleEndian
1026
0
            v5 = value5.littleEndian
1027
0
            v6 = value6.littleEndian
1028
0
            v7 = value7.littleEndian
1029
0
        }
1030
0
1031
0
        var offset = index
1032
0
        var bytesWritten = 0
1033
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
1034
0
        offset = offset &+ MemoryLayout<T1>.size
1035
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
1036
0
        offset = offset &+ MemoryLayout<T2>.size
1037
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
1038
0
        offset = offset &+ MemoryLayout<T3>.size
1039
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
1040
0
        offset = offset &+ MemoryLayout<T4>.size
1041
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
1042
0
        offset = offset &+ MemoryLayout<T5>.size
1043
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
1044
0
        offset = offset &+ MemoryLayout<T6>.size
1045
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
1046
0
        offset = offset &+ MemoryLayout<T7>.size
1047
0
        return bytesWritten
1048
0
    }
1049
1050
    @inlinable
1051
    @_alwaysEmitIntoClient
1052
    public mutating func readMultipleIntegers<
1053
        T1: FixedWidthInteger,
1054
        T2: FixedWidthInteger,
1055
        T3: FixedWidthInteger,
1056
        T4: FixedWidthInteger,
1057
        T5: FixedWidthInteger,
1058
        T6: FixedWidthInteger,
1059
        T7: FixedWidthInteger,
1060
        T8: FixedWidthInteger
1061
    >(
1062
        endianness: Endianness = .big,
1063
        as: (T1, T2, T3, T4, T5, T6, T7, T8).Type = (T1, T2, T3, T4, T5, T6, T7, T8).self
1064
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8)? {
1065
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
1066
0
            return nil
1067
0
        }
1068
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1069
0
        bytesRequired &+= MemoryLayout<T2>.size
1070
0
        bytesRequired &+= MemoryLayout<T3>.size
1071
0
        bytesRequired &+= MemoryLayout<T4>.size
1072
0
        bytesRequired &+= MemoryLayout<T5>.size
1073
0
        bytesRequired &+= MemoryLayout<T6>.size
1074
0
        bytesRequired &+= MemoryLayout<T7>.size
1075
0
        bytesRequired &+= MemoryLayout<T8>.size
1076
0
        self._moveReaderIndex(forwardBy: bytesRequired)
1077
0
        return result
1078
0
    }
1079
1080
    @inlinable
1081
    @_alwaysEmitIntoClient
1082
    public func peekMultipleIntegers<
1083
        T1: FixedWidthInteger,
1084
        T2: FixedWidthInteger,
1085
        T3: FixedWidthInteger,
1086
        T4: FixedWidthInteger,
1087
        T5: FixedWidthInteger,
1088
        T6: FixedWidthInteger,
1089
        T7: FixedWidthInteger,
1090
        T8: FixedWidthInteger
1091
    >(
1092
        endianness: Endianness = .big,
1093
        as: (T1, T2, T3, T4, T5, T6, T7, T8).Type = (T1, T2, T3, T4, T5, T6, T7, T8).self
1094
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8)? {
1095
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
1096
0
    }
1097
1098
    @inlinable
1099
    @_alwaysEmitIntoClient
1100
    public func getMultipleIntegers<
1101
        T1: FixedWidthInteger,
1102
        T2: FixedWidthInteger,
1103
        T3: FixedWidthInteger,
1104
        T4: FixedWidthInteger,
1105
        T5: FixedWidthInteger,
1106
        T6: FixedWidthInteger,
1107
        T7: FixedWidthInteger,
1108
        T8: FixedWidthInteger
1109
    >(
1110
        at index: Int,
1111
        endianness: Endianness = .big,
1112
        as: (T1, T2, T3, T4, T5, T6, T7, T8).Type = (T1, T2, T3, T4, T5, T6, T7, T8).self
1113
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8)? {
1114
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1115
0
        bytesRequired &+= MemoryLayout<T2>.size
1116
0
        bytesRequired &+= MemoryLayout<T3>.size
1117
0
        bytesRequired &+= MemoryLayout<T4>.size
1118
0
        bytesRequired &+= MemoryLayout<T5>.size
1119
0
        bytesRequired &+= MemoryLayout<T6>.size
1120
0
        bytesRequired &+= MemoryLayout<T7>.size
1121
0
        bytesRequired &+= MemoryLayout<T8>.size
1122
0
1123
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
1124
0
            return nil
1125
0
        }
1126
0
1127
0
        var v1: T1 = 0
1128
0
        var v2: T2 = 0
1129
0
        var v3: T3 = 0
1130
0
        var v4: T4 = 0
1131
0
        var v5: T5 = 0
1132
0
        var v6: T6 = 0
1133
0
        var v7: T7 = 0
1134
0
        var v8: T8 = 0
1135
0
        var offset = range.lowerBound
1136
0
        self.withUnsafeReadableBytes { ptr in
1137
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
1138
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
1139
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
1140
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
1141
0
            }
1142
0
            offset = offset &+ MemoryLayout<T1>.size
1143
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
1144
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
1145
0
            }
1146
0
            offset = offset &+ MemoryLayout<T2>.size
1147
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
1148
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
1149
0
            }
1150
0
            offset = offset &+ MemoryLayout<T3>.size
1151
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
1152
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
1153
0
            }
1154
0
            offset = offset &+ MemoryLayout<T4>.size
1155
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
1156
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
1157
0
            }
1158
0
            offset = offset &+ MemoryLayout<T5>.size
1159
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
1160
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
1161
0
            }
1162
0
            offset = offset &+ MemoryLayout<T6>.size
1163
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
1164
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
1165
0
            }
1166
0
            offset = offset &+ MemoryLayout<T7>.size
1167
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
1168
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
1169
0
            }
1170
0
            offset = offset &+ MemoryLayout<T8>.size
1171
0
            assert(offset == range.upperBound)
1172
0
        }
1173
0
        switch endianness {
1174
0
        case .big:
1175
0
            return (
1176
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
1177
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8)
1178
0
            )
1179
0
        case .little:
1180
0
            return (
1181
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
1182
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8)
1183
0
            )
1184
0
        }
1185
0
    }
1186
1187
    @inlinable
1188
    @_alwaysEmitIntoClient
1189
    @discardableResult
1190
    public mutating func writeMultipleIntegers<
1191
        T1: FixedWidthInteger,
1192
        T2: FixedWidthInteger,
1193
        T3: FixedWidthInteger,
1194
        T4: FixedWidthInteger,
1195
        T5: FixedWidthInteger,
1196
        T6: FixedWidthInteger,
1197
        T7: FixedWidthInteger,
1198
        T8: FixedWidthInteger
1199
    >(
1200
        _ value1: T1,
1201
        _ value2: T2,
1202
        _ value3: T3,
1203
        _ value4: T4,
1204
        _ value5: T5,
1205
        _ value6: T6,
1206
        _ value7: T7,
1207
        _ value8: T8,
1208
        endianness: Endianness = .big,
1209
        as: (T1, T2, T3, T4, T5, T6, T7, T8).Type = (T1, T2, T3, T4, T5, T6, T7, T8).self
1210
0
    ) -> Int {
1211
0
        let bytesWritten = self.setMultipleIntegers(
1212
0
            value1,
1213
0
            value2,
1214
0
            value3,
1215
0
            value4,
1216
0
            value5,
1217
0
            value6,
1218
0
            value7,
1219
0
            value8,
1220
0
            at: self.writerIndex,
1221
0
            endianness: endianness,
1222
0
            as: `as`
1223
0
        )
1224
0
        self._moveWriterIndex(forwardBy: bytesWritten)
1225
0
        return bytesWritten
1226
0
    }
1227
1228
    @inlinable
1229
    @_alwaysEmitIntoClient
1230
    @discardableResult
1231
    public mutating func setMultipleIntegers<
1232
        T1: FixedWidthInteger,
1233
        T2: FixedWidthInteger,
1234
        T3: FixedWidthInteger,
1235
        T4: FixedWidthInteger,
1236
        T5: FixedWidthInteger,
1237
        T6: FixedWidthInteger,
1238
        T7: FixedWidthInteger,
1239
        T8: FixedWidthInteger
1240
    >(
1241
        _ value1: T1,
1242
        _ value2: T2,
1243
        _ value3: T3,
1244
        _ value4: T4,
1245
        _ value5: T5,
1246
        _ value6: T6,
1247
        _ value7: T7,
1248
        _ value8: T8,
1249
        at index: Int,
1250
        endianness: Endianness = .big,
1251
        as: (T1, T2, T3, T4, T5, T6, T7, T8).Type = (T1, T2, T3, T4, T5, T6, T7, T8).self
1252
0
    ) -> Int {
1253
0
        var v1: T1
1254
0
        var v2: T2
1255
0
        var v3: T3
1256
0
        var v4: T4
1257
0
        var v5: T5
1258
0
        var v6: T6
1259
0
        var v7: T7
1260
0
        var v8: T8
1261
0
        switch endianness {
1262
0
        case .big:
1263
0
            v1 = value1.bigEndian
1264
0
            v2 = value2.bigEndian
1265
0
            v3 = value3.bigEndian
1266
0
            v4 = value4.bigEndian
1267
0
            v5 = value5.bigEndian
1268
0
            v6 = value6.bigEndian
1269
0
            v7 = value7.bigEndian
1270
0
            v8 = value8.bigEndian
1271
0
        case .little:
1272
0
            v1 = value1.littleEndian
1273
0
            v2 = value2.littleEndian
1274
0
            v3 = value3.littleEndian
1275
0
            v4 = value4.littleEndian
1276
0
            v5 = value5.littleEndian
1277
0
            v6 = value6.littleEndian
1278
0
            v7 = value7.littleEndian
1279
0
            v8 = value8.littleEndian
1280
0
        }
1281
0
1282
0
        var offset = index
1283
0
        var bytesWritten = 0
1284
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
1285
0
        offset = offset &+ MemoryLayout<T1>.size
1286
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
1287
0
        offset = offset &+ MemoryLayout<T2>.size
1288
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
1289
0
        offset = offset &+ MemoryLayout<T3>.size
1290
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
1291
0
        offset = offset &+ MemoryLayout<T4>.size
1292
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
1293
0
        offset = offset &+ MemoryLayout<T5>.size
1294
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
1295
0
        offset = offset &+ MemoryLayout<T6>.size
1296
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
1297
0
        offset = offset &+ MemoryLayout<T7>.size
1298
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
1299
0
        offset = offset &+ MemoryLayout<T8>.size
1300
0
        return bytesWritten
1301
0
    }
1302
1303
    @inlinable
1304
    @_alwaysEmitIntoClient
1305
    public mutating func readMultipleIntegers<
1306
        T1: FixedWidthInteger,
1307
        T2: FixedWidthInteger,
1308
        T3: FixedWidthInteger,
1309
        T4: FixedWidthInteger,
1310
        T5: FixedWidthInteger,
1311
        T6: FixedWidthInteger,
1312
        T7: FixedWidthInteger,
1313
        T8: FixedWidthInteger,
1314
        T9: FixedWidthInteger
1315
    >(
1316
        endianness: Endianness = .big,
1317
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9).self
1318
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9)? {
1319
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
1320
0
            return nil
1321
0
        }
1322
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1323
0
        bytesRequired &+= MemoryLayout<T2>.size
1324
0
        bytesRequired &+= MemoryLayout<T3>.size
1325
0
        bytesRequired &+= MemoryLayout<T4>.size
1326
0
        bytesRequired &+= MemoryLayout<T5>.size
1327
0
        bytesRequired &+= MemoryLayout<T6>.size
1328
0
        bytesRequired &+= MemoryLayout<T7>.size
1329
0
        bytesRequired &+= MemoryLayout<T8>.size
1330
0
        bytesRequired &+= MemoryLayout<T9>.size
1331
0
        self._moveReaderIndex(forwardBy: bytesRequired)
1332
0
        return result
1333
0
    }
1334
1335
    @inlinable
1336
    @_alwaysEmitIntoClient
1337
    public func peekMultipleIntegers<
1338
        T1: FixedWidthInteger,
1339
        T2: FixedWidthInteger,
1340
        T3: FixedWidthInteger,
1341
        T4: FixedWidthInteger,
1342
        T5: FixedWidthInteger,
1343
        T6: FixedWidthInteger,
1344
        T7: FixedWidthInteger,
1345
        T8: FixedWidthInteger,
1346
        T9: FixedWidthInteger
1347
    >(
1348
        endianness: Endianness = .big,
1349
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9).self
1350
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9)? {
1351
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
1352
0
    }
1353
1354
    @inlinable
1355
    @_alwaysEmitIntoClient
1356
    public func getMultipleIntegers<
1357
        T1: FixedWidthInteger,
1358
        T2: FixedWidthInteger,
1359
        T3: FixedWidthInteger,
1360
        T4: FixedWidthInteger,
1361
        T5: FixedWidthInteger,
1362
        T6: FixedWidthInteger,
1363
        T7: FixedWidthInteger,
1364
        T8: FixedWidthInteger,
1365
        T9: FixedWidthInteger
1366
    >(
1367
        at index: Int,
1368
        endianness: Endianness = .big,
1369
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9).self
1370
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9)? {
1371
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1372
0
        bytesRequired &+= MemoryLayout<T2>.size
1373
0
        bytesRequired &+= MemoryLayout<T3>.size
1374
0
        bytesRequired &+= MemoryLayout<T4>.size
1375
0
        bytesRequired &+= MemoryLayout<T5>.size
1376
0
        bytesRequired &+= MemoryLayout<T6>.size
1377
0
        bytesRequired &+= MemoryLayout<T7>.size
1378
0
        bytesRequired &+= MemoryLayout<T8>.size
1379
0
        bytesRequired &+= MemoryLayout<T9>.size
1380
0
1381
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
1382
0
            return nil
1383
0
        }
1384
0
1385
0
        var v1: T1 = 0
1386
0
        var v2: T2 = 0
1387
0
        var v3: T3 = 0
1388
0
        var v4: T4 = 0
1389
0
        var v5: T5 = 0
1390
0
        var v6: T6 = 0
1391
0
        var v7: T7 = 0
1392
0
        var v8: T8 = 0
1393
0
        var v9: T9 = 0
1394
0
        var offset = range.lowerBound
1395
0
        self.withUnsafeReadableBytes { ptr in
1396
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
1397
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
1398
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
1399
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
1400
0
            }
1401
0
            offset = offset &+ MemoryLayout<T1>.size
1402
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
1403
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
1404
0
            }
1405
0
            offset = offset &+ MemoryLayout<T2>.size
1406
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
1407
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
1408
0
            }
1409
0
            offset = offset &+ MemoryLayout<T3>.size
1410
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
1411
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
1412
0
            }
1413
0
            offset = offset &+ MemoryLayout<T4>.size
1414
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
1415
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
1416
0
            }
1417
0
            offset = offset &+ MemoryLayout<T5>.size
1418
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
1419
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
1420
0
            }
1421
0
            offset = offset &+ MemoryLayout<T6>.size
1422
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
1423
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
1424
0
            }
1425
0
            offset = offset &+ MemoryLayout<T7>.size
1426
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
1427
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
1428
0
            }
1429
0
            offset = offset &+ MemoryLayout<T8>.size
1430
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
1431
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
1432
0
            }
1433
0
            offset = offset &+ MemoryLayout<T9>.size
1434
0
            assert(offset == range.upperBound)
1435
0
        }
1436
0
        switch endianness {
1437
0
        case .big:
1438
0
            return (
1439
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
1440
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9)
1441
0
            )
1442
0
        case .little:
1443
0
            return (
1444
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
1445
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
1446
0
                T9(littleEndian: v9)
1447
0
            )
1448
0
        }
1449
0
    }
1450
1451
    @inlinable
1452
    @_alwaysEmitIntoClient
1453
    @discardableResult
1454
    public mutating func writeMultipleIntegers<
1455
        T1: FixedWidthInteger,
1456
        T2: FixedWidthInteger,
1457
        T3: FixedWidthInteger,
1458
        T4: FixedWidthInteger,
1459
        T5: FixedWidthInteger,
1460
        T6: FixedWidthInteger,
1461
        T7: FixedWidthInteger,
1462
        T8: FixedWidthInteger,
1463
        T9: FixedWidthInteger
1464
    >(
1465
        _ value1: T1,
1466
        _ value2: T2,
1467
        _ value3: T3,
1468
        _ value4: T4,
1469
        _ value5: T5,
1470
        _ value6: T6,
1471
        _ value7: T7,
1472
        _ value8: T8,
1473
        _ value9: T9,
1474
        endianness: Endianness = .big,
1475
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9).self
1476
0
    ) -> Int {
1477
0
        let bytesWritten = self.setMultipleIntegers(
1478
0
            value1,
1479
0
            value2,
1480
0
            value3,
1481
0
            value4,
1482
0
            value5,
1483
0
            value6,
1484
0
            value7,
1485
0
            value8,
1486
0
            value9,
1487
0
            at: self.writerIndex,
1488
0
            endianness: endianness,
1489
0
            as: `as`
1490
0
        )
1491
0
        self._moveWriterIndex(forwardBy: bytesWritten)
1492
0
        return bytesWritten
1493
0
    }
1494
1495
    @inlinable
1496
    @_alwaysEmitIntoClient
1497
    @discardableResult
1498
    public mutating func setMultipleIntegers<
1499
        T1: FixedWidthInteger,
1500
        T2: FixedWidthInteger,
1501
        T3: FixedWidthInteger,
1502
        T4: FixedWidthInteger,
1503
        T5: FixedWidthInteger,
1504
        T6: FixedWidthInteger,
1505
        T7: FixedWidthInteger,
1506
        T8: FixedWidthInteger,
1507
        T9: FixedWidthInteger
1508
    >(
1509
        _ value1: T1,
1510
        _ value2: T2,
1511
        _ value3: T3,
1512
        _ value4: T4,
1513
        _ value5: T5,
1514
        _ value6: T6,
1515
        _ value7: T7,
1516
        _ value8: T8,
1517
        _ value9: T9,
1518
        at index: Int,
1519
        endianness: Endianness = .big,
1520
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9).self
1521
0
    ) -> Int {
1522
0
        var v1: T1
1523
0
        var v2: T2
1524
0
        var v3: T3
1525
0
        var v4: T4
1526
0
        var v5: T5
1527
0
        var v6: T6
1528
0
        var v7: T7
1529
0
        var v8: T8
1530
0
        var v9: T9
1531
0
        switch endianness {
1532
0
        case .big:
1533
0
            v1 = value1.bigEndian
1534
0
            v2 = value2.bigEndian
1535
0
            v3 = value3.bigEndian
1536
0
            v4 = value4.bigEndian
1537
0
            v5 = value5.bigEndian
1538
0
            v6 = value6.bigEndian
1539
0
            v7 = value7.bigEndian
1540
0
            v8 = value8.bigEndian
1541
0
            v9 = value9.bigEndian
1542
0
        case .little:
1543
0
            v1 = value1.littleEndian
1544
0
            v2 = value2.littleEndian
1545
0
            v3 = value3.littleEndian
1546
0
            v4 = value4.littleEndian
1547
0
            v5 = value5.littleEndian
1548
0
            v6 = value6.littleEndian
1549
0
            v7 = value7.littleEndian
1550
0
            v8 = value8.littleEndian
1551
0
            v9 = value9.littleEndian
1552
0
        }
1553
0
1554
0
        var offset = index
1555
0
        var bytesWritten = 0
1556
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
1557
0
        offset = offset &+ MemoryLayout<T1>.size
1558
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
1559
0
        offset = offset &+ MemoryLayout<T2>.size
1560
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
1561
0
        offset = offset &+ MemoryLayout<T3>.size
1562
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
1563
0
        offset = offset &+ MemoryLayout<T4>.size
1564
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
1565
0
        offset = offset &+ MemoryLayout<T5>.size
1566
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
1567
0
        offset = offset &+ MemoryLayout<T6>.size
1568
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
1569
0
        offset = offset &+ MemoryLayout<T7>.size
1570
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
1571
0
        offset = offset &+ MemoryLayout<T8>.size
1572
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
1573
0
        offset = offset &+ MemoryLayout<T9>.size
1574
0
        return bytesWritten
1575
0
    }
1576
1577
    @inlinable
1578
    @_alwaysEmitIntoClient
1579
    public mutating func readMultipleIntegers<
1580
        T1: FixedWidthInteger,
1581
        T2: FixedWidthInteger,
1582
        T3: FixedWidthInteger,
1583
        T4: FixedWidthInteger,
1584
        T5: FixedWidthInteger,
1585
        T6: FixedWidthInteger,
1586
        T7: FixedWidthInteger,
1587
        T8: FixedWidthInteger,
1588
        T9: FixedWidthInteger,
1589
        T10: FixedWidthInteger
1590
    >(
1591
        endianness: Endianness = .big,
1592
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).self
1593
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)? {
1594
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
1595
0
            return nil
1596
0
        }
1597
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1598
0
        bytesRequired &+= MemoryLayout<T2>.size
1599
0
        bytesRequired &+= MemoryLayout<T3>.size
1600
0
        bytesRequired &+= MemoryLayout<T4>.size
1601
0
        bytesRequired &+= MemoryLayout<T5>.size
1602
0
        bytesRequired &+= MemoryLayout<T6>.size
1603
0
        bytesRequired &+= MemoryLayout<T7>.size
1604
0
        bytesRequired &+= MemoryLayout<T8>.size
1605
0
        bytesRequired &+= MemoryLayout<T9>.size
1606
0
        bytesRequired &+= MemoryLayout<T10>.size
1607
0
        self._moveReaderIndex(forwardBy: bytesRequired)
1608
0
        return result
1609
0
    }
1610
1611
    @inlinable
1612
    @_alwaysEmitIntoClient
1613
    public func peekMultipleIntegers<
1614
        T1: FixedWidthInteger,
1615
        T2: FixedWidthInteger,
1616
        T3: FixedWidthInteger,
1617
        T4: FixedWidthInteger,
1618
        T5: FixedWidthInteger,
1619
        T6: FixedWidthInteger,
1620
        T7: FixedWidthInteger,
1621
        T8: FixedWidthInteger,
1622
        T9: FixedWidthInteger,
1623
        T10: FixedWidthInteger
1624
    >(
1625
        endianness: Endianness = .big,
1626
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).self
1627
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)? {
1628
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
1629
0
    }
1630
1631
    @inlinable
1632
    @_alwaysEmitIntoClient
1633
    public func getMultipleIntegers<
1634
        T1: FixedWidthInteger,
1635
        T2: FixedWidthInteger,
1636
        T3: FixedWidthInteger,
1637
        T4: FixedWidthInteger,
1638
        T5: FixedWidthInteger,
1639
        T6: FixedWidthInteger,
1640
        T7: FixedWidthInteger,
1641
        T8: FixedWidthInteger,
1642
        T9: FixedWidthInteger,
1643
        T10: FixedWidthInteger
1644
    >(
1645
        at index: Int,
1646
        endianness: Endianness = .big,
1647
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).self
1648
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)? {
1649
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1650
0
        bytesRequired &+= MemoryLayout<T2>.size
1651
0
        bytesRequired &+= MemoryLayout<T3>.size
1652
0
        bytesRequired &+= MemoryLayout<T4>.size
1653
0
        bytesRequired &+= MemoryLayout<T5>.size
1654
0
        bytesRequired &+= MemoryLayout<T6>.size
1655
0
        bytesRequired &+= MemoryLayout<T7>.size
1656
0
        bytesRequired &+= MemoryLayout<T8>.size
1657
0
        bytesRequired &+= MemoryLayout<T9>.size
1658
0
        bytesRequired &+= MemoryLayout<T10>.size
1659
0
1660
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
1661
0
            return nil
1662
0
        }
1663
0
1664
0
        var v1: T1 = 0
1665
0
        var v2: T2 = 0
1666
0
        var v3: T3 = 0
1667
0
        var v4: T4 = 0
1668
0
        var v5: T5 = 0
1669
0
        var v6: T6 = 0
1670
0
        var v7: T7 = 0
1671
0
        var v8: T8 = 0
1672
0
        var v9: T9 = 0
1673
0
        var v10: T10 = 0
1674
0
        var offset = range.lowerBound
1675
0
        self.withUnsafeReadableBytes { ptr in
1676
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
1677
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
1678
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
1679
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
1680
0
            }
1681
0
            offset = offset &+ MemoryLayout<T1>.size
1682
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
1683
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
1684
0
            }
1685
0
            offset = offset &+ MemoryLayout<T2>.size
1686
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
1687
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
1688
0
            }
1689
0
            offset = offset &+ MemoryLayout<T3>.size
1690
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
1691
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
1692
0
            }
1693
0
            offset = offset &+ MemoryLayout<T4>.size
1694
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
1695
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
1696
0
            }
1697
0
            offset = offset &+ MemoryLayout<T5>.size
1698
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
1699
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
1700
0
            }
1701
0
            offset = offset &+ MemoryLayout<T6>.size
1702
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
1703
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
1704
0
            }
1705
0
            offset = offset &+ MemoryLayout<T7>.size
1706
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
1707
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
1708
0
            }
1709
0
            offset = offset &+ MemoryLayout<T8>.size
1710
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
1711
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
1712
0
            }
1713
0
            offset = offset &+ MemoryLayout<T9>.size
1714
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
1715
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
1716
0
            }
1717
0
            offset = offset &+ MemoryLayout<T10>.size
1718
0
            assert(offset == range.upperBound)
1719
0
        }
1720
0
        switch endianness {
1721
0
        case .big:
1722
0
            return (
1723
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
1724
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10)
1725
0
            )
1726
0
        case .little:
1727
0
            return (
1728
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
1729
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
1730
0
                T9(littleEndian: v9), T10(littleEndian: v10)
1731
0
            )
1732
0
        }
1733
0
    }
1734
1735
    @inlinable
1736
    @_alwaysEmitIntoClient
1737
    @discardableResult
1738
    public mutating func writeMultipleIntegers<
1739
        T1: FixedWidthInteger,
1740
        T2: FixedWidthInteger,
1741
        T3: FixedWidthInteger,
1742
        T4: FixedWidthInteger,
1743
        T5: FixedWidthInteger,
1744
        T6: FixedWidthInteger,
1745
        T7: FixedWidthInteger,
1746
        T8: FixedWidthInteger,
1747
        T9: FixedWidthInteger,
1748
        T10: FixedWidthInteger
1749
    >(
1750
        _ value1: T1,
1751
        _ value2: T2,
1752
        _ value3: T3,
1753
        _ value4: T4,
1754
        _ value5: T5,
1755
        _ value6: T6,
1756
        _ value7: T7,
1757
        _ value8: T8,
1758
        _ value9: T9,
1759
        _ value10: T10,
1760
        endianness: Endianness = .big,
1761
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).self
1762
0
    ) -> Int {
1763
0
        let bytesWritten = self.setMultipleIntegers(
1764
0
            value1,
1765
0
            value2,
1766
0
            value3,
1767
0
            value4,
1768
0
            value5,
1769
0
            value6,
1770
0
            value7,
1771
0
            value8,
1772
0
            value9,
1773
0
            value10,
1774
0
            at: self.writerIndex,
1775
0
            endianness: endianness,
1776
0
            as: `as`
1777
0
        )
1778
0
        self._moveWriterIndex(forwardBy: bytesWritten)
1779
0
        return bytesWritten
1780
0
    }
1781
1782
    @inlinable
1783
    @_alwaysEmitIntoClient
1784
    @discardableResult
1785
    public mutating func setMultipleIntegers<
1786
        T1: FixedWidthInteger,
1787
        T2: FixedWidthInteger,
1788
        T3: FixedWidthInteger,
1789
        T4: FixedWidthInteger,
1790
        T5: FixedWidthInteger,
1791
        T6: FixedWidthInteger,
1792
        T7: FixedWidthInteger,
1793
        T8: FixedWidthInteger,
1794
        T9: FixedWidthInteger,
1795
        T10: FixedWidthInteger
1796
    >(
1797
        _ value1: T1,
1798
        _ value2: T2,
1799
        _ value3: T3,
1800
        _ value4: T4,
1801
        _ value5: T5,
1802
        _ value6: T6,
1803
        _ value7: T7,
1804
        _ value8: T8,
1805
        _ value9: T9,
1806
        _ value10: T10,
1807
        at index: Int,
1808
        endianness: Endianness = .big,
1809
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10).self
1810
0
    ) -> Int {
1811
0
        var v1: T1
1812
0
        var v2: T2
1813
0
        var v3: T3
1814
0
        var v4: T4
1815
0
        var v5: T5
1816
0
        var v6: T6
1817
0
        var v7: T7
1818
0
        var v8: T8
1819
0
        var v9: T9
1820
0
        var v10: T10
1821
0
        switch endianness {
1822
0
        case .big:
1823
0
            v1 = value1.bigEndian
1824
0
            v2 = value2.bigEndian
1825
0
            v3 = value3.bigEndian
1826
0
            v4 = value4.bigEndian
1827
0
            v5 = value5.bigEndian
1828
0
            v6 = value6.bigEndian
1829
0
            v7 = value7.bigEndian
1830
0
            v8 = value8.bigEndian
1831
0
            v9 = value9.bigEndian
1832
0
            v10 = value10.bigEndian
1833
0
        case .little:
1834
0
            v1 = value1.littleEndian
1835
0
            v2 = value2.littleEndian
1836
0
            v3 = value3.littleEndian
1837
0
            v4 = value4.littleEndian
1838
0
            v5 = value5.littleEndian
1839
0
            v6 = value6.littleEndian
1840
0
            v7 = value7.littleEndian
1841
0
            v8 = value8.littleEndian
1842
0
            v9 = value9.littleEndian
1843
0
            v10 = value10.littleEndian
1844
0
        }
1845
0
1846
0
        var offset = index
1847
0
        var bytesWritten = 0
1848
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
1849
0
        offset = offset &+ MemoryLayout<T1>.size
1850
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
1851
0
        offset = offset &+ MemoryLayout<T2>.size
1852
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
1853
0
        offset = offset &+ MemoryLayout<T3>.size
1854
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
1855
0
        offset = offset &+ MemoryLayout<T4>.size
1856
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
1857
0
        offset = offset &+ MemoryLayout<T5>.size
1858
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
1859
0
        offset = offset &+ MemoryLayout<T6>.size
1860
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
1861
0
        offset = offset &+ MemoryLayout<T7>.size
1862
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
1863
0
        offset = offset &+ MemoryLayout<T8>.size
1864
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
1865
0
        offset = offset &+ MemoryLayout<T9>.size
1866
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
1867
0
        offset = offset &+ MemoryLayout<T10>.size
1868
0
        return bytesWritten
1869
0
    }
1870
1871
    @inlinable
1872
    @_alwaysEmitIntoClient
1873
    public mutating func readMultipleIntegers<
1874
        T1: FixedWidthInteger,
1875
        T2: FixedWidthInteger,
1876
        T3: FixedWidthInteger,
1877
        T4: FixedWidthInteger,
1878
        T5: FixedWidthInteger,
1879
        T6: FixedWidthInteger,
1880
        T7: FixedWidthInteger,
1881
        T8: FixedWidthInteger,
1882
        T9: FixedWidthInteger,
1883
        T10: FixedWidthInteger,
1884
        T11: FixedWidthInteger
1885
    >(
1886
        endianness: Endianness = .big,
1887
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).self
1888
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)? {
1889
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
1890
0
            return nil
1891
0
        }
1892
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1893
0
        bytesRequired &+= MemoryLayout<T2>.size
1894
0
        bytesRequired &+= MemoryLayout<T3>.size
1895
0
        bytesRequired &+= MemoryLayout<T4>.size
1896
0
        bytesRequired &+= MemoryLayout<T5>.size
1897
0
        bytesRequired &+= MemoryLayout<T6>.size
1898
0
        bytesRequired &+= MemoryLayout<T7>.size
1899
0
        bytesRequired &+= MemoryLayout<T8>.size
1900
0
        bytesRequired &+= MemoryLayout<T9>.size
1901
0
        bytesRequired &+= MemoryLayout<T10>.size
1902
0
        bytesRequired &+= MemoryLayout<T11>.size
1903
0
        self._moveReaderIndex(forwardBy: bytesRequired)
1904
0
        return result
1905
0
    }
1906
1907
    @inlinable
1908
    @_alwaysEmitIntoClient
1909
    public func peekMultipleIntegers<
1910
        T1: FixedWidthInteger,
1911
        T2: FixedWidthInteger,
1912
        T3: FixedWidthInteger,
1913
        T4: FixedWidthInteger,
1914
        T5: FixedWidthInteger,
1915
        T6: FixedWidthInteger,
1916
        T7: FixedWidthInteger,
1917
        T8: FixedWidthInteger,
1918
        T9: FixedWidthInteger,
1919
        T10: FixedWidthInteger,
1920
        T11: FixedWidthInteger
1921
    >(
1922
        endianness: Endianness = .big,
1923
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).self
1924
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)? {
1925
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
1926
0
    }
1927
1928
    @inlinable
1929
    @_alwaysEmitIntoClient
1930
    public func getMultipleIntegers<
1931
        T1: FixedWidthInteger,
1932
        T2: FixedWidthInteger,
1933
        T3: FixedWidthInteger,
1934
        T4: FixedWidthInteger,
1935
        T5: FixedWidthInteger,
1936
        T6: FixedWidthInteger,
1937
        T7: FixedWidthInteger,
1938
        T8: FixedWidthInteger,
1939
        T9: FixedWidthInteger,
1940
        T10: FixedWidthInteger,
1941
        T11: FixedWidthInteger
1942
    >(
1943
        at index: Int,
1944
        endianness: Endianness = .big,
1945
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).self
1946
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)? {
1947
0
        var bytesRequired: Int = MemoryLayout<T1>.size
1948
0
        bytesRequired &+= MemoryLayout<T2>.size
1949
0
        bytesRequired &+= MemoryLayout<T3>.size
1950
0
        bytesRequired &+= MemoryLayout<T4>.size
1951
0
        bytesRequired &+= MemoryLayout<T5>.size
1952
0
        bytesRequired &+= MemoryLayout<T6>.size
1953
0
        bytesRequired &+= MemoryLayout<T7>.size
1954
0
        bytesRequired &+= MemoryLayout<T8>.size
1955
0
        bytesRequired &+= MemoryLayout<T9>.size
1956
0
        bytesRequired &+= MemoryLayout<T10>.size
1957
0
        bytesRequired &+= MemoryLayout<T11>.size
1958
0
1959
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
1960
0
            return nil
1961
0
        }
1962
0
1963
0
        var v1: T1 = 0
1964
0
        var v2: T2 = 0
1965
0
        var v3: T3 = 0
1966
0
        var v4: T4 = 0
1967
0
        var v5: T5 = 0
1968
0
        var v6: T6 = 0
1969
0
        var v7: T7 = 0
1970
0
        var v8: T8 = 0
1971
0
        var v9: T9 = 0
1972
0
        var v10: T10 = 0
1973
0
        var v11: T11 = 0
1974
0
        var offset = range.lowerBound
1975
0
        self.withUnsafeReadableBytes { ptr in
1976
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
1977
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
1978
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
1979
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
1980
0
            }
1981
0
            offset = offset &+ MemoryLayout<T1>.size
1982
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
1983
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
1984
0
            }
1985
0
            offset = offset &+ MemoryLayout<T2>.size
1986
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
1987
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
1988
0
            }
1989
0
            offset = offset &+ MemoryLayout<T3>.size
1990
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
1991
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
1992
0
            }
1993
0
            offset = offset &+ MemoryLayout<T4>.size
1994
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
1995
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
1996
0
            }
1997
0
            offset = offset &+ MemoryLayout<T5>.size
1998
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
1999
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
2000
0
            }
2001
0
            offset = offset &+ MemoryLayout<T6>.size
2002
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
2003
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
2004
0
            }
2005
0
            offset = offset &+ MemoryLayout<T7>.size
2006
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
2007
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
2008
0
            }
2009
0
            offset = offset &+ MemoryLayout<T8>.size
2010
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
2011
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
2012
0
            }
2013
0
            offset = offset &+ MemoryLayout<T9>.size
2014
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
2015
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
2016
0
            }
2017
0
            offset = offset &+ MemoryLayout<T10>.size
2018
0
            withUnsafeMutableBytes(of: &v11) { destPtr in
2019
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T11>.size)
2020
0
            }
2021
0
            offset = offset &+ MemoryLayout<T11>.size
2022
0
            assert(offset == range.upperBound)
2023
0
        }
2024
0
        switch endianness {
2025
0
        case .big:
2026
0
            return (
2027
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
2028
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10),
2029
0
                T11(bigEndian: v11)
2030
0
            )
2031
0
        case .little:
2032
0
            return (
2033
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
2034
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
2035
0
                T9(littleEndian: v9), T10(littleEndian: v10), T11(littleEndian: v11)
2036
0
            )
2037
0
        }
2038
0
    }
2039
2040
    @inlinable
2041
    @_alwaysEmitIntoClient
2042
    @discardableResult
2043
    public mutating func writeMultipleIntegers<
2044
        T1: FixedWidthInteger,
2045
        T2: FixedWidthInteger,
2046
        T3: FixedWidthInteger,
2047
        T4: FixedWidthInteger,
2048
        T5: FixedWidthInteger,
2049
        T6: FixedWidthInteger,
2050
        T7: FixedWidthInteger,
2051
        T8: FixedWidthInteger,
2052
        T9: FixedWidthInteger,
2053
        T10: FixedWidthInteger,
2054
        T11: FixedWidthInteger
2055
    >(
2056
        _ value1: T1,
2057
        _ value2: T2,
2058
        _ value3: T3,
2059
        _ value4: T4,
2060
        _ value5: T5,
2061
        _ value6: T6,
2062
        _ value7: T7,
2063
        _ value8: T8,
2064
        _ value9: T9,
2065
        _ value10: T10,
2066
        _ value11: T11,
2067
        endianness: Endianness = .big,
2068
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).self
2069
0
    ) -> Int {
2070
0
        let bytesWritten = self.setMultipleIntegers(
2071
0
            value1,
2072
0
            value2,
2073
0
            value3,
2074
0
            value4,
2075
0
            value5,
2076
0
            value6,
2077
0
            value7,
2078
0
            value8,
2079
0
            value9,
2080
0
            value10,
2081
0
            value11,
2082
0
            at: self.writerIndex,
2083
0
            endianness: endianness,
2084
0
            as: `as`
2085
0
        )
2086
0
        self._moveWriterIndex(forwardBy: bytesWritten)
2087
0
        return bytesWritten
2088
0
    }
2089
2090
    @inlinable
2091
    @_alwaysEmitIntoClient
2092
    @discardableResult
2093
    public mutating func setMultipleIntegers<
2094
        T1: FixedWidthInteger,
2095
        T2: FixedWidthInteger,
2096
        T3: FixedWidthInteger,
2097
        T4: FixedWidthInteger,
2098
        T5: FixedWidthInteger,
2099
        T6: FixedWidthInteger,
2100
        T7: FixedWidthInteger,
2101
        T8: FixedWidthInteger,
2102
        T9: FixedWidthInteger,
2103
        T10: FixedWidthInteger,
2104
        T11: FixedWidthInteger
2105
    >(
2106
        _ value1: T1,
2107
        _ value2: T2,
2108
        _ value3: T3,
2109
        _ value4: T4,
2110
        _ value5: T5,
2111
        _ value6: T6,
2112
        _ value7: T7,
2113
        _ value8: T8,
2114
        _ value9: T9,
2115
        _ value10: T10,
2116
        _ value11: T11,
2117
        at index: Int,
2118
        endianness: Endianness = .big,
2119
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).Type = (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11).self
2120
0
    ) -> Int {
2121
0
        var v1: T1
2122
0
        var v2: T2
2123
0
        var v3: T3
2124
0
        var v4: T4
2125
0
        var v5: T5
2126
0
        var v6: T6
2127
0
        var v7: T7
2128
0
        var v8: T8
2129
0
        var v9: T9
2130
0
        var v10: T10
2131
0
        var v11: T11
2132
0
        switch endianness {
2133
0
        case .big:
2134
0
            v1 = value1.bigEndian
2135
0
            v2 = value2.bigEndian
2136
0
            v3 = value3.bigEndian
2137
0
            v4 = value4.bigEndian
2138
0
            v5 = value5.bigEndian
2139
0
            v6 = value6.bigEndian
2140
0
            v7 = value7.bigEndian
2141
0
            v8 = value8.bigEndian
2142
0
            v9 = value9.bigEndian
2143
0
            v10 = value10.bigEndian
2144
0
            v11 = value11.bigEndian
2145
0
        case .little:
2146
0
            v1 = value1.littleEndian
2147
0
            v2 = value2.littleEndian
2148
0
            v3 = value3.littleEndian
2149
0
            v4 = value4.littleEndian
2150
0
            v5 = value5.littleEndian
2151
0
            v6 = value6.littleEndian
2152
0
            v7 = value7.littleEndian
2153
0
            v8 = value8.littleEndian
2154
0
            v9 = value9.littleEndian
2155
0
            v10 = value10.littleEndian
2156
0
            v11 = value11.littleEndian
2157
0
        }
2158
0
2159
0
        var offset = index
2160
0
        var bytesWritten = 0
2161
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
2162
0
        offset = offset &+ MemoryLayout<T1>.size
2163
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
2164
0
        offset = offset &+ MemoryLayout<T2>.size
2165
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
2166
0
        offset = offset &+ MemoryLayout<T3>.size
2167
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
2168
0
        offset = offset &+ MemoryLayout<T4>.size
2169
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
2170
0
        offset = offset &+ MemoryLayout<T5>.size
2171
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
2172
0
        offset = offset &+ MemoryLayout<T6>.size
2173
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
2174
0
        offset = offset &+ MemoryLayout<T7>.size
2175
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
2176
0
        offset = offset &+ MemoryLayout<T8>.size
2177
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
2178
0
        offset = offset &+ MemoryLayout<T9>.size
2179
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
2180
0
        offset = offset &+ MemoryLayout<T10>.size
2181
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v11) { self.setBytes($0, at: offset) }
2182
0
        offset = offset &+ MemoryLayout<T11>.size
2183
0
        return bytesWritten
2184
0
    }
2185
2186
    @inlinable
2187
    @_alwaysEmitIntoClient
2188
    public mutating func readMultipleIntegers<
2189
        T1: FixedWidthInteger,
2190
        T2: FixedWidthInteger,
2191
        T3: FixedWidthInteger,
2192
        T4: FixedWidthInteger,
2193
        T5: FixedWidthInteger,
2194
        T6: FixedWidthInteger,
2195
        T7: FixedWidthInteger,
2196
        T8: FixedWidthInteger,
2197
        T9: FixedWidthInteger,
2198
        T10: FixedWidthInteger,
2199
        T11: FixedWidthInteger,
2200
        T12: FixedWidthInteger
2201
    >(
2202
        endianness: Endianness = .big,
2203
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12).Type = (
2204
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
2205
        ).self
2206
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)? {
2207
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
2208
0
            return nil
2209
0
        }
2210
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2211
0
        bytesRequired &+= MemoryLayout<T2>.size
2212
0
        bytesRequired &+= MemoryLayout<T3>.size
2213
0
        bytesRequired &+= MemoryLayout<T4>.size
2214
0
        bytesRequired &+= MemoryLayout<T5>.size
2215
0
        bytesRequired &+= MemoryLayout<T6>.size
2216
0
        bytesRequired &+= MemoryLayout<T7>.size
2217
0
        bytesRequired &+= MemoryLayout<T8>.size
2218
0
        bytesRequired &+= MemoryLayout<T9>.size
2219
0
        bytesRequired &+= MemoryLayout<T10>.size
2220
0
        bytesRequired &+= MemoryLayout<T11>.size
2221
0
        bytesRequired &+= MemoryLayout<T12>.size
2222
0
        self._moveReaderIndex(forwardBy: bytesRequired)
2223
0
        return result
2224
0
    }
2225
2226
    @inlinable
2227
    @_alwaysEmitIntoClient
2228
    public func peekMultipleIntegers<
2229
        T1: FixedWidthInteger,
2230
        T2: FixedWidthInteger,
2231
        T3: FixedWidthInteger,
2232
        T4: FixedWidthInteger,
2233
        T5: FixedWidthInteger,
2234
        T6: FixedWidthInteger,
2235
        T7: FixedWidthInteger,
2236
        T8: FixedWidthInteger,
2237
        T9: FixedWidthInteger,
2238
        T10: FixedWidthInteger,
2239
        T11: FixedWidthInteger,
2240
        T12: FixedWidthInteger
2241
    >(
2242
        endianness: Endianness = .big,
2243
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12).Type = (
2244
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
2245
        ).self
2246
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)? {
2247
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
2248
0
    }
2249
2250
    @inlinable
2251
    @_alwaysEmitIntoClient
2252
    public func getMultipleIntegers<
2253
        T1: FixedWidthInteger,
2254
        T2: FixedWidthInteger,
2255
        T3: FixedWidthInteger,
2256
        T4: FixedWidthInteger,
2257
        T5: FixedWidthInteger,
2258
        T6: FixedWidthInteger,
2259
        T7: FixedWidthInteger,
2260
        T8: FixedWidthInteger,
2261
        T9: FixedWidthInteger,
2262
        T10: FixedWidthInteger,
2263
        T11: FixedWidthInteger,
2264
        T12: FixedWidthInteger
2265
    >(
2266
        at index: Int,
2267
        endianness: Endianness = .big,
2268
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12).Type = (
2269
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
2270
        ).self
2271
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)? {
2272
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2273
0
        bytesRequired &+= MemoryLayout<T2>.size
2274
0
        bytesRequired &+= MemoryLayout<T3>.size
2275
0
        bytesRequired &+= MemoryLayout<T4>.size
2276
0
        bytesRequired &+= MemoryLayout<T5>.size
2277
0
        bytesRequired &+= MemoryLayout<T6>.size
2278
0
        bytesRequired &+= MemoryLayout<T7>.size
2279
0
        bytesRequired &+= MemoryLayout<T8>.size
2280
0
        bytesRequired &+= MemoryLayout<T9>.size
2281
0
        bytesRequired &+= MemoryLayout<T10>.size
2282
0
        bytesRequired &+= MemoryLayout<T11>.size
2283
0
        bytesRequired &+= MemoryLayout<T12>.size
2284
0
2285
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
2286
0
            return nil
2287
0
        }
2288
0
2289
0
        var v1: T1 = 0
2290
0
        var v2: T2 = 0
2291
0
        var v3: T3 = 0
2292
0
        var v4: T4 = 0
2293
0
        var v5: T5 = 0
2294
0
        var v6: T6 = 0
2295
0
        var v7: T7 = 0
2296
0
        var v8: T8 = 0
2297
0
        var v9: T9 = 0
2298
0
        var v10: T10 = 0
2299
0
        var v11: T11 = 0
2300
0
        var v12: T12 = 0
2301
0
        var offset = range.lowerBound
2302
0
        self.withUnsafeReadableBytes { ptr in
2303
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
2304
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
2305
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
2306
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
2307
0
            }
2308
0
            offset = offset &+ MemoryLayout<T1>.size
2309
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
2310
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
2311
0
            }
2312
0
            offset = offset &+ MemoryLayout<T2>.size
2313
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
2314
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
2315
0
            }
2316
0
            offset = offset &+ MemoryLayout<T3>.size
2317
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
2318
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
2319
0
            }
2320
0
            offset = offset &+ MemoryLayout<T4>.size
2321
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
2322
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
2323
0
            }
2324
0
            offset = offset &+ MemoryLayout<T5>.size
2325
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
2326
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
2327
0
            }
2328
0
            offset = offset &+ MemoryLayout<T6>.size
2329
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
2330
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
2331
0
            }
2332
0
            offset = offset &+ MemoryLayout<T7>.size
2333
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
2334
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
2335
0
            }
2336
0
            offset = offset &+ MemoryLayout<T8>.size
2337
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
2338
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
2339
0
            }
2340
0
            offset = offset &+ MemoryLayout<T9>.size
2341
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
2342
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
2343
0
            }
2344
0
            offset = offset &+ MemoryLayout<T10>.size
2345
0
            withUnsafeMutableBytes(of: &v11) { destPtr in
2346
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T11>.size)
2347
0
            }
2348
0
            offset = offset &+ MemoryLayout<T11>.size
2349
0
            withUnsafeMutableBytes(of: &v12) { destPtr in
2350
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T12>.size)
2351
0
            }
2352
0
            offset = offset &+ MemoryLayout<T12>.size
2353
0
            assert(offset == range.upperBound)
2354
0
        }
2355
0
        switch endianness {
2356
0
        case .big:
2357
0
            return (
2358
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
2359
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10),
2360
0
                T11(bigEndian: v11), T12(bigEndian: v12)
2361
0
            )
2362
0
        case .little:
2363
0
            return (
2364
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
2365
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
2366
0
                T9(littleEndian: v9), T10(littleEndian: v10), T11(littleEndian: v11), T12(littleEndian: v12)
2367
0
            )
2368
0
        }
2369
0
    }
2370
2371
    @inlinable
2372
    @_alwaysEmitIntoClient
2373
    @discardableResult
2374
    public mutating func writeMultipleIntegers<
2375
        T1: FixedWidthInteger,
2376
        T2: FixedWidthInteger,
2377
        T3: FixedWidthInteger,
2378
        T4: FixedWidthInteger,
2379
        T5: FixedWidthInteger,
2380
        T6: FixedWidthInteger,
2381
        T7: FixedWidthInteger,
2382
        T8: FixedWidthInteger,
2383
        T9: FixedWidthInteger,
2384
        T10: FixedWidthInteger,
2385
        T11: FixedWidthInteger,
2386
        T12: FixedWidthInteger
2387
    >(
2388
        _ value1: T1,
2389
        _ value2: T2,
2390
        _ value3: T3,
2391
        _ value4: T4,
2392
        _ value5: T5,
2393
        _ value6: T6,
2394
        _ value7: T7,
2395
        _ value8: T8,
2396
        _ value9: T9,
2397
        _ value10: T10,
2398
        _ value11: T11,
2399
        _ value12: T12,
2400
        endianness: Endianness = .big,
2401
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12).Type = (
2402
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
2403
        ).self
2404
0
    ) -> Int {
2405
0
        let bytesWritten = self.setMultipleIntegers(
2406
0
            value1,
2407
0
            value2,
2408
0
            value3,
2409
0
            value4,
2410
0
            value5,
2411
0
            value6,
2412
0
            value7,
2413
0
            value8,
2414
0
            value9,
2415
0
            value10,
2416
0
            value11,
2417
0
            value12,
2418
0
            at: self.writerIndex,
2419
0
            endianness: endianness,
2420
0
            as: `as`
2421
0
        )
2422
0
        self._moveWriterIndex(forwardBy: bytesWritten)
2423
0
        return bytesWritten
2424
0
    }
2425
2426
    @inlinable
2427
    @_alwaysEmitIntoClient
2428
    @discardableResult
2429
    public mutating func setMultipleIntegers<
2430
        T1: FixedWidthInteger,
2431
        T2: FixedWidthInteger,
2432
        T3: FixedWidthInteger,
2433
        T4: FixedWidthInteger,
2434
        T5: FixedWidthInteger,
2435
        T6: FixedWidthInteger,
2436
        T7: FixedWidthInteger,
2437
        T8: FixedWidthInteger,
2438
        T9: FixedWidthInteger,
2439
        T10: FixedWidthInteger,
2440
        T11: FixedWidthInteger,
2441
        T12: FixedWidthInteger
2442
    >(
2443
        _ value1: T1,
2444
        _ value2: T2,
2445
        _ value3: T3,
2446
        _ value4: T4,
2447
        _ value5: T5,
2448
        _ value6: T6,
2449
        _ value7: T7,
2450
        _ value8: T8,
2451
        _ value9: T9,
2452
        _ value10: T10,
2453
        _ value11: T11,
2454
        _ value12: T12,
2455
        at index: Int,
2456
        endianness: Endianness = .big,
2457
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12).Type = (
2458
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
2459
        ).self
2460
0
    ) -> Int {
2461
0
        var v1: T1
2462
0
        var v2: T2
2463
0
        var v3: T3
2464
0
        var v4: T4
2465
0
        var v5: T5
2466
0
        var v6: T6
2467
0
        var v7: T7
2468
0
        var v8: T8
2469
0
        var v9: T9
2470
0
        var v10: T10
2471
0
        var v11: T11
2472
0
        var v12: T12
2473
0
        switch endianness {
2474
0
        case .big:
2475
0
            v1 = value1.bigEndian
2476
0
            v2 = value2.bigEndian
2477
0
            v3 = value3.bigEndian
2478
0
            v4 = value4.bigEndian
2479
0
            v5 = value5.bigEndian
2480
0
            v6 = value6.bigEndian
2481
0
            v7 = value7.bigEndian
2482
0
            v8 = value8.bigEndian
2483
0
            v9 = value9.bigEndian
2484
0
            v10 = value10.bigEndian
2485
0
            v11 = value11.bigEndian
2486
0
            v12 = value12.bigEndian
2487
0
        case .little:
2488
0
            v1 = value1.littleEndian
2489
0
            v2 = value2.littleEndian
2490
0
            v3 = value3.littleEndian
2491
0
            v4 = value4.littleEndian
2492
0
            v5 = value5.littleEndian
2493
0
            v6 = value6.littleEndian
2494
0
            v7 = value7.littleEndian
2495
0
            v8 = value8.littleEndian
2496
0
            v9 = value9.littleEndian
2497
0
            v10 = value10.littleEndian
2498
0
            v11 = value11.littleEndian
2499
0
            v12 = value12.littleEndian
2500
0
        }
2501
0
2502
0
        var offset = index
2503
0
        var bytesWritten = 0
2504
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
2505
0
        offset = offset &+ MemoryLayout<T1>.size
2506
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
2507
0
        offset = offset &+ MemoryLayout<T2>.size
2508
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
2509
0
        offset = offset &+ MemoryLayout<T3>.size
2510
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
2511
0
        offset = offset &+ MemoryLayout<T4>.size
2512
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
2513
0
        offset = offset &+ MemoryLayout<T5>.size
2514
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
2515
0
        offset = offset &+ MemoryLayout<T6>.size
2516
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
2517
0
        offset = offset &+ MemoryLayout<T7>.size
2518
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
2519
0
        offset = offset &+ MemoryLayout<T8>.size
2520
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
2521
0
        offset = offset &+ MemoryLayout<T9>.size
2522
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
2523
0
        offset = offset &+ MemoryLayout<T10>.size
2524
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v11) { self.setBytes($0, at: offset) }
2525
0
        offset = offset &+ MemoryLayout<T11>.size
2526
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v12) { self.setBytes($0, at: offset) }
2527
0
        offset = offset &+ MemoryLayout<T12>.size
2528
0
        return bytesWritten
2529
0
    }
2530
2531
    @inlinable
2532
    @_alwaysEmitIntoClient
2533
    public mutating func readMultipleIntegers<
2534
        T1: FixedWidthInteger,
2535
        T2: FixedWidthInteger,
2536
        T3: FixedWidthInteger,
2537
        T4: FixedWidthInteger,
2538
        T5: FixedWidthInteger,
2539
        T6: FixedWidthInteger,
2540
        T7: FixedWidthInteger,
2541
        T8: FixedWidthInteger,
2542
        T9: FixedWidthInteger,
2543
        T10: FixedWidthInteger,
2544
        T11: FixedWidthInteger,
2545
        T12: FixedWidthInteger,
2546
        T13: FixedWidthInteger
2547
    >(
2548
        endianness: Endianness = .big,
2549
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13).Type = (
2550
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
2551
        ).self
2552
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)? {
2553
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
2554
0
            return nil
2555
0
        }
2556
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2557
0
        bytesRequired &+= MemoryLayout<T2>.size
2558
0
        bytesRequired &+= MemoryLayout<T3>.size
2559
0
        bytesRequired &+= MemoryLayout<T4>.size
2560
0
        bytesRequired &+= MemoryLayout<T5>.size
2561
0
        bytesRequired &+= MemoryLayout<T6>.size
2562
0
        bytesRequired &+= MemoryLayout<T7>.size
2563
0
        bytesRequired &+= MemoryLayout<T8>.size
2564
0
        bytesRequired &+= MemoryLayout<T9>.size
2565
0
        bytesRequired &+= MemoryLayout<T10>.size
2566
0
        bytesRequired &+= MemoryLayout<T11>.size
2567
0
        bytesRequired &+= MemoryLayout<T12>.size
2568
0
        bytesRequired &+= MemoryLayout<T13>.size
2569
0
        self._moveReaderIndex(forwardBy: bytesRequired)
2570
0
        return result
2571
0
    }
2572
2573
    @inlinable
2574
    @_alwaysEmitIntoClient
2575
    public func peekMultipleIntegers<
2576
        T1: FixedWidthInteger,
2577
        T2: FixedWidthInteger,
2578
        T3: FixedWidthInteger,
2579
        T4: FixedWidthInteger,
2580
        T5: FixedWidthInteger,
2581
        T6: FixedWidthInteger,
2582
        T7: FixedWidthInteger,
2583
        T8: FixedWidthInteger,
2584
        T9: FixedWidthInteger,
2585
        T10: FixedWidthInteger,
2586
        T11: FixedWidthInteger,
2587
        T12: FixedWidthInteger,
2588
        T13: FixedWidthInteger
2589
    >(
2590
        endianness: Endianness = .big,
2591
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13).Type = (
2592
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
2593
        ).self
2594
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)? {
2595
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
2596
0
    }
2597
2598
    @inlinable
2599
    @_alwaysEmitIntoClient
2600
    public func getMultipleIntegers<
2601
        T1: FixedWidthInteger,
2602
        T2: FixedWidthInteger,
2603
        T3: FixedWidthInteger,
2604
        T4: FixedWidthInteger,
2605
        T5: FixedWidthInteger,
2606
        T6: FixedWidthInteger,
2607
        T7: FixedWidthInteger,
2608
        T8: FixedWidthInteger,
2609
        T9: FixedWidthInteger,
2610
        T10: FixedWidthInteger,
2611
        T11: FixedWidthInteger,
2612
        T12: FixedWidthInteger,
2613
        T13: FixedWidthInteger
2614
    >(
2615
        at index: Int,
2616
        endianness: Endianness = .big,
2617
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13).Type = (
2618
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
2619
        ).self
2620
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)? {
2621
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2622
0
        bytesRequired &+= MemoryLayout<T2>.size
2623
0
        bytesRequired &+= MemoryLayout<T3>.size
2624
0
        bytesRequired &+= MemoryLayout<T4>.size
2625
0
        bytesRequired &+= MemoryLayout<T5>.size
2626
0
        bytesRequired &+= MemoryLayout<T6>.size
2627
0
        bytesRequired &+= MemoryLayout<T7>.size
2628
0
        bytesRequired &+= MemoryLayout<T8>.size
2629
0
        bytesRequired &+= MemoryLayout<T9>.size
2630
0
        bytesRequired &+= MemoryLayout<T10>.size
2631
0
        bytesRequired &+= MemoryLayout<T11>.size
2632
0
        bytesRequired &+= MemoryLayout<T12>.size
2633
0
        bytesRequired &+= MemoryLayout<T13>.size
2634
0
2635
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
2636
0
            return nil
2637
0
        }
2638
0
2639
0
        var v1: T1 = 0
2640
0
        var v2: T2 = 0
2641
0
        var v3: T3 = 0
2642
0
        var v4: T4 = 0
2643
0
        var v5: T5 = 0
2644
0
        var v6: T6 = 0
2645
0
        var v7: T7 = 0
2646
0
        var v8: T8 = 0
2647
0
        var v9: T9 = 0
2648
0
        var v10: T10 = 0
2649
0
        var v11: T11 = 0
2650
0
        var v12: T12 = 0
2651
0
        var v13: T13 = 0
2652
0
        var offset = range.lowerBound
2653
0
        self.withUnsafeReadableBytes { ptr in
2654
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
2655
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
2656
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
2657
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
2658
0
            }
2659
0
            offset = offset &+ MemoryLayout<T1>.size
2660
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
2661
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
2662
0
            }
2663
0
            offset = offset &+ MemoryLayout<T2>.size
2664
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
2665
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
2666
0
            }
2667
0
            offset = offset &+ MemoryLayout<T3>.size
2668
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
2669
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
2670
0
            }
2671
0
            offset = offset &+ MemoryLayout<T4>.size
2672
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
2673
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
2674
0
            }
2675
0
            offset = offset &+ MemoryLayout<T5>.size
2676
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
2677
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
2678
0
            }
2679
0
            offset = offset &+ MemoryLayout<T6>.size
2680
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
2681
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
2682
0
            }
2683
0
            offset = offset &+ MemoryLayout<T7>.size
2684
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
2685
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
2686
0
            }
2687
0
            offset = offset &+ MemoryLayout<T8>.size
2688
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
2689
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
2690
0
            }
2691
0
            offset = offset &+ MemoryLayout<T9>.size
2692
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
2693
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
2694
0
            }
2695
0
            offset = offset &+ MemoryLayout<T10>.size
2696
0
            withUnsafeMutableBytes(of: &v11) { destPtr in
2697
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T11>.size)
2698
0
            }
2699
0
            offset = offset &+ MemoryLayout<T11>.size
2700
0
            withUnsafeMutableBytes(of: &v12) { destPtr in
2701
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T12>.size)
2702
0
            }
2703
0
            offset = offset &+ MemoryLayout<T12>.size
2704
0
            withUnsafeMutableBytes(of: &v13) { destPtr in
2705
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T13>.size)
2706
0
            }
2707
0
            offset = offset &+ MemoryLayout<T13>.size
2708
0
            assert(offset == range.upperBound)
2709
0
        }
2710
0
        switch endianness {
2711
0
        case .big:
2712
0
            return (
2713
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
2714
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10),
2715
0
                T11(bigEndian: v11), T12(bigEndian: v12), T13(bigEndian: v13)
2716
0
            )
2717
0
        case .little:
2718
0
            return (
2719
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
2720
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
2721
0
                T9(littleEndian: v9), T10(littleEndian: v10), T11(littleEndian: v11), T12(littleEndian: v12),
2722
0
                T13(littleEndian: v13)
2723
0
            )
2724
0
        }
2725
0
    }
2726
2727
    @inlinable
2728
    @_alwaysEmitIntoClient
2729
    @discardableResult
2730
    public mutating func writeMultipleIntegers<
2731
        T1: FixedWidthInteger,
2732
        T2: FixedWidthInteger,
2733
        T3: FixedWidthInteger,
2734
        T4: FixedWidthInteger,
2735
        T5: FixedWidthInteger,
2736
        T6: FixedWidthInteger,
2737
        T7: FixedWidthInteger,
2738
        T8: FixedWidthInteger,
2739
        T9: FixedWidthInteger,
2740
        T10: FixedWidthInteger,
2741
        T11: FixedWidthInteger,
2742
        T12: FixedWidthInteger,
2743
        T13: FixedWidthInteger
2744
    >(
2745
        _ value1: T1,
2746
        _ value2: T2,
2747
        _ value3: T3,
2748
        _ value4: T4,
2749
        _ value5: T5,
2750
        _ value6: T6,
2751
        _ value7: T7,
2752
        _ value8: T8,
2753
        _ value9: T9,
2754
        _ value10: T10,
2755
        _ value11: T11,
2756
        _ value12: T12,
2757
        _ value13: T13,
2758
        endianness: Endianness = .big,
2759
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13).Type = (
2760
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
2761
        ).self
2762
0
    ) -> Int {
2763
0
        let bytesWritten = self.setMultipleIntegers(
2764
0
            value1,
2765
0
            value2,
2766
0
            value3,
2767
0
            value4,
2768
0
            value5,
2769
0
            value6,
2770
0
            value7,
2771
0
            value8,
2772
0
            value9,
2773
0
            value10,
2774
0
            value11,
2775
0
            value12,
2776
0
            value13,
2777
0
            at: self.writerIndex,
2778
0
            endianness: endianness,
2779
0
            as: `as`
2780
0
        )
2781
0
        self._moveWriterIndex(forwardBy: bytesWritten)
2782
0
        return bytesWritten
2783
0
    }
2784
2785
    @inlinable
2786
    @_alwaysEmitIntoClient
2787
    @discardableResult
2788
    public mutating func setMultipleIntegers<
2789
        T1: FixedWidthInteger,
2790
        T2: FixedWidthInteger,
2791
        T3: FixedWidthInteger,
2792
        T4: FixedWidthInteger,
2793
        T5: FixedWidthInteger,
2794
        T6: FixedWidthInteger,
2795
        T7: FixedWidthInteger,
2796
        T8: FixedWidthInteger,
2797
        T9: FixedWidthInteger,
2798
        T10: FixedWidthInteger,
2799
        T11: FixedWidthInteger,
2800
        T12: FixedWidthInteger,
2801
        T13: FixedWidthInteger
2802
    >(
2803
        _ value1: T1,
2804
        _ value2: T2,
2805
        _ value3: T3,
2806
        _ value4: T4,
2807
        _ value5: T5,
2808
        _ value6: T6,
2809
        _ value7: T7,
2810
        _ value8: T8,
2811
        _ value9: T9,
2812
        _ value10: T10,
2813
        _ value11: T11,
2814
        _ value12: T12,
2815
        _ value13: T13,
2816
        at index: Int,
2817
        endianness: Endianness = .big,
2818
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13).Type = (
2819
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13
2820
        ).self
2821
0
    ) -> Int {
2822
0
        var v1: T1
2823
0
        var v2: T2
2824
0
        var v3: T3
2825
0
        var v4: T4
2826
0
        var v5: T5
2827
0
        var v6: T6
2828
0
        var v7: T7
2829
0
        var v8: T8
2830
0
        var v9: T9
2831
0
        var v10: T10
2832
0
        var v11: T11
2833
0
        var v12: T12
2834
0
        var v13: T13
2835
0
        switch endianness {
2836
0
        case .big:
2837
0
            v1 = value1.bigEndian
2838
0
            v2 = value2.bigEndian
2839
0
            v3 = value3.bigEndian
2840
0
            v4 = value4.bigEndian
2841
0
            v5 = value5.bigEndian
2842
0
            v6 = value6.bigEndian
2843
0
            v7 = value7.bigEndian
2844
0
            v8 = value8.bigEndian
2845
0
            v9 = value9.bigEndian
2846
0
            v10 = value10.bigEndian
2847
0
            v11 = value11.bigEndian
2848
0
            v12 = value12.bigEndian
2849
0
            v13 = value13.bigEndian
2850
0
        case .little:
2851
0
            v1 = value1.littleEndian
2852
0
            v2 = value2.littleEndian
2853
0
            v3 = value3.littleEndian
2854
0
            v4 = value4.littleEndian
2855
0
            v5 = value5.littleEndian
2856
0
            v6 = value6.littleEndian
2857
0
            v7 = value7.littleEndian
2858
0
            v8 = value8.littleEndian
2859
0
            v9 = value9.littleEndian
2860
0
            v10 = value10.littleEndian
2861
0
            v11 = value11.littleEndian
2862
0
            v12 = value12.littleEndian
2863
0
            v13 = value13.littleEndian
2864
0
        }
2865
0
2866
0
        var offset = index
2867
0
        var bytesWritten = 0
2868
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
2869
0
        offset = offset &+ MemoryLayout<T1>.size
2870
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
2871
0
        offset = offset &+ MemoryLayout<T2>.size
2872
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
2873
0
        offset = offset &+ MemoryLayout<T3>.size
2874
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
2875
0
        offset = offset &+ MemoryLayout<T4>.size
2876
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
2877
0
        offset = offset &+ MemoryLayout<T5>.size
2878
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
2879
0
        offset = offset &+ MemoryLayout<T6>.size
2880
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
2881
0
        offset = offset &+ MemoryLayout<T7>.size
2882
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
2883
0
        offset = offset &+ MemoryLayout<T8>.size
2884
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
2885
0
        offset = offset &+ MemoryLayout<T9>.size
2886
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
2887
0
        offset = offset &+ MemoryLayout<T10>.size
2888
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v11) { self.setBytes($0, at: offset) }
2889
0
        offset = offset &+ MemoryLayout<T11>.size
2890
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v12) { self.setBytes($0, at: offset) }
2891
0
        offset = offset &+ MemoryLayout<T12>.size
2892
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v13) { self.setBytes($0, at: offset) }
2893
0
        offset = offset &+ MemoryLayout<T13>.size
2894
0
        return bytesWritten
2895
0
    }
2896
2897
    @inlinable
2898
    @_alwaysEmitIntoClient
2899
    public mutating func readMultipleIntegers<
2900
        T1: FixedWidthInteger,
2901
        T2: FixedWidthInteger,
2902
        T3: FixedWidthInteger,
2903
        T4: FixedWidthInteger,
2904
        T5: FixedWidthInteger,
2905
        T6: FixedWidthInteger,
2906
        T7: FixedWidthInteger,
2907
        T8: FixedWidthInteger,
2908
        T9: FixedWidthInteger,
2909
        T10: FixedWidthInteger,
2910
        T11: FixedWidthInteger,
2911
        T12: FixedWidthInteger,
2912
        T13: FixedWidthInteger,
2913
        T14: FixedWidthInteger
2914
    >(
2915
        endianness: Endianness = .big,
2916
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14).Type = (
2917
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
2918
        ).self
2919
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)? {
2920
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
2921
0
            return nil
2922
0
        }
2923
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2924
0
        bytesRequired &+= MemoryLayout<T2>.size
2925
0
        bytesRequired &+= MemoryLayout<T3>.size
2926
0
        bytesRequired &+= MemoryLayout<T4>.size
2927
0
        bytesRequired &+= MemoryLayout<T5>.size
2928
0
        bytesRequired &+= MemoryLayout<T6>.size
2929
0
        bytesRequired &+= MemoryLayout<T7>.size
2930
0
        bytesRequired &+= MemoryLayout<T8>.size
2931
0
        bytesRequired &+= MemoryLayout<T9>.size
2932
0
        bytesRequired &+= MemoryLayout<T10>.size
2933
0
        bytesRequired &+= MemoryLayout<T11>.size
2934
0
        bytesRequired &+= MemoryLayout<T12>.size
2935
0
        bytesRequired &+= MemoryLayout<T13>.size
2936
0
        bytesRequired &+= MemoryLayout<T14>.size
2937
0
        self._moveReaderIndex(forwardBy: bytesRequired)
2938
0
        return result
2939
0
    }
2940
2941
    @inlinable
2942
    @_alwaysEmitIntoClient
2943
    public func peekMultipleIntegers<
2944
        T1: FixedWidthInteger,
2945
        T2: FixedWidthInteger,
2946
        T3: FixedWidthInteger,
2947
        T4: FixedWidthInteger,
2948
        T5: FixedWidthInteger,
2949
        T6: FixedWidthInteger,
2950
        T7: FixedWidthInteger,
2951
        T8: FixedWidthInteger,
2952
        T9: FixedWidthInteger,
2953
        T10: FixedWidthInteger,
2954
        T11: FixedWidthInteger,
2955
        T12: FixedWidthInteger,
2956
        T13: FixedWidthInteger,
2957
        T14: FixedWidthInteger
2958
    >(
2959
        endianness: Endianness = .big,
2960
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14).Type = (
2961
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
2962
        ).self
2963
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)? {
2964
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
2965
0
    }
2966
2967
    @inlinable
2968
    @_alwaysEmitIntoClient
2969
    public func getMultipleIntegers<
2970
        T1: FixedWidthInteger,
2971
        T2: FixedWidthInteger,
2972
        T3: FixedWidthInteger,
2973
        T4: FixedWidthInteger,
2974
        T5: FixedWidthInteger,
2975
        T6: FixedWidthInteger,
2976
        T7: FixedWidthInteger,
2977
        T8: FixedWidthInteger,
2978
        T9: FixedWidthInteger,
2979
        T10: FixedWidthInteger,
2980
        T11: FixedWidthInteger,
2981
        T12: FixedWidthInteger,
2982
        T13: FixedWidthInteger,
2983
        T14: FixedWidthInteger
2984
    >(
2985
        at index: Int,
2986
        endianness: Endianness = .big,
2987
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14).Type = (
2988
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
2989
        ).self
2990
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)? {
2991
0
        var bytesRequired: Int = MemoryLayout<T1>.size
2992
0
        bytesRequired &+= MemoryLayout<T2>.size
2993
0
        bytesRequired &+= MemoryLayout<T3>.size
2994
0
        bytesRequired &+= MemoryLayout<T4>.size
2995
0
        bytesRequired &+= MemoryLayout<T5>.size
2996
0
        bytesRequired &+= MemoryLayout<T6>.size
2997
0
        bytesRequired &+= MemoryLayout<T7>.size
2998
0
        bytesRequired &+= MemoryLayout<T8>.size
2999
0
        bytesRequired &+= MemoryLayout<T9>.size
3000
0
        bytesRequired &+= MemoryLayout<T10>.size
3001
0
        bytesRequired &+= MemoryLayout<T11>.size
3002
0
        bytesRequired &+= MemoryLayout<T12>.size
3003
0
        bytesRequired &+= MemoryLayout<T13>.size
3004
0
        bytesRequired &+= MemoryLayout<T14>.size
3005
0
3006
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
3007
0
            return nil
3008
0
        }
3009
0
3010
0
        var v1: T1 = 0
3011
0
        var v2: T2 = 0
3012
0
        var v3: T3 = 0
3013
0
        var v4: T4 = 0
3014
0
        var v5: T5 = 0
3015
0
        var v6: T6 = 0
3016
0
        var v7: T7 = 0
3017
0
        var v8: T8 = 0
3018
0
        var v9: T9 = 0
3019
0
        var v10: T10 = 0
3020
0
        var v11: T11 = 0
3021
0
        var v12: T12 = 0
3022
0
        var v13: T13 = 0
3023
0
        var v14: T14 = 0
3024
0
        var offset = range.lowerBound
3025
0
        self.withUnsafeReadableBytes { ptr in
3026
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
3027
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
3028
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
3029
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
3030
0
            }
3031
0
            offset = offset &+ MemoryLayout<T1>.size
3032
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
3033
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
3034
0
            }
3035
0
            offset = offset &+ MemoryLayout<T2>.size
3036
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
3037
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
3038
0
            }
3039
0
            offset = offset &+ MemoryLayout<T3>.size
3040
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
3041
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
3042
0
            }
3043
0
            offset = offset &+ MemoryLayout<T4>.size
3044
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
3045
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
3046
0
            }
3047
0
            offset = offset &+ MemoryLayout<T5>.size
3048
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
3049
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
3050
0
            }
3051
0
            offset = offset &+ MemoryLayout<T6>.size
3052
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
3053
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
3054
0
            }
3055
0
            offset = offset &+ MemoryLayout<T7>.size
3056
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
3057
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
3058
0
            }
3059
0
            offset = offset &+ MemoryLayout<T8>.size
3060
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
3061
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
3062
0
            }
3063
0
            offset = offset &+ MemoryLayout<T9>.size
3064
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
3065
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
3066
0
            }
3067
0
            offset = offset &+ MemoryLayout<T10>.size
3068
0
            withUnsafeMutableBytes(of: &v11) { destPtr in
3069
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T11>.size)
3070
0
            }
3071
0
            offset = offset &+ MemoryLayout<T11>.size
3072
0
            withUnsafeMutableBytes(of: &v12) { destPtr in
3073
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T12>.size)
3074
0
            }
3075
0
            offset = offset &+ MemoryLayout<T12>.size
3076
0
            withUnsafeMutableBytes(of: &v13) { destPtr in
3077
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T13>.size)
3078
0
            }
3079
0
            offset = offset &+ MemoryLayout<T13>.size
3080
0
            withUnsafeMutableBytes(of: &v14) { destPtr in
3081
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T14>.size)
3082
0
            }
3083
0
            offset = offset &+ MemoryLayout<T14>.size
3084
0
            assert(offset == range.upperBound)
3085
0
        }
3086
0
        switch endianness {
3087
0
        case .big:
3088
0
            return (
3089
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
3090
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10),
3091
0
                T11(bigEndian: v11), T12(bigEndian: v12), T13(bigEndian: v13), T14(bigEndian: v14)
3092
0
            )
3093
0
        case .little:
3094
0
            return (
3095
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
3096
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
3097
0
                T9(littleEndian: v9), T10(littleEndian: v10), T11(littleEndian: v11), T12(littleEndian: v12),
3098
0
                T13(littleEndian: v13), T14(littleEndian: v14)
3099
0
            )
3100
0
        }
3101
0
    }
3102
3103
    @inlinable
3104
    @_alwaysEmitIntoClient
3105
    @discardableResult
3106
    public mutating func writeMultipleIntegers<
3107
        T1: FixedWidthInteger,
3108
        T2: FixedWidthInteger,
3109
        T3: FixedWidthInteger,
3110
        T4: FixedWidthInteger,
3111
        T5: FixedWidthInteger,
3112
        T6: FixedWidthInteger,
3113
        T7: FixedWidthInteger,
3114
        T8: FixedWidthInteger,
3115
        T9: FixedWidthInteger,
3116
        T10: FixedWidthInteger,
3117
        T11: FixedWidthInteger,
3118
        T12: FixedWidthInteger,
3119
        T13: FixedWidthInteger,
3120
        T14: FixedWidthInteger
3121
    >(
3122
        _ value1: T1,
3123
        _ value2: T2,
3124
        _ value3: T3,
3125
        _ value4: T4,
3126
        _ value5: T5,
3127
        _ value6: T6,
3128
        _ value7: T7,
3129
        _ value8: T8,
3130
        _ value9: T9,
3131
        _ value10: T10,
3132
        _ value11: T11,
3133
        _ value12: T12,
3134
        _ value13: T13,
3135
        _ value14: T14,
3136
        endianness: Endianness = .big,
3137
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14).Type = (
3138
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
3139
        ).self
3140
0
    ) -> Int {
3141
0
        let bytesWritten = self.setMultipleIntegers(
3142
0
            value1,
3143
0
            value2,
3144
0
            value3,
3145
0
            value4,
3146
0
            value5,
3147
0
            value6,
3148
0
            value7,
3149
0
            value8,
3150
0
            value9,
3151
0
            value10,
3152
0
            value11,
3153
0
            value12,
3154
0
            value13,
3155
0
            value14,
3156
0
            at: self.writerIndex,
3157
0
            endianness: endianness,
3158
0
            as: `as`
3159
0
        )
3160
0
        self._moveWriterIndex(forwardBy: bytesWritten)
3161
0
        return bytesWritten
3162
0
    }
3163
3164
    @inlinable
3165
    @_alwaysEmitIntoClient
3166
    @discardableResult
3167
    public mutating func setMultipleIntegers<
3168
        T1: FixedWidthInteger,
3169
        T2: FixedWidthInteger,
3170
        T3: FixedWidthInteger,
3171
        T4: FixedWidthInteger,
3172
        T5: FixedWidthInteger,
3173
        T6: FixedWidthInteger,
3174
        T7: FixedWidthInteger,
3175
        T8: FixedWidthInteger,
3176
        T9: FixedWidthInteger,
3177
        T10: FixedWidthInteger,
3178
        T11: FixedWidthInteger,
3179
        T12: FixedWidthInteger,
3180
        T13: FixedWidthInteger,
3181
        T14: FixedWidthInteger
3182
    >(
3183
        _ value1: T1,
3184
        _ value2: T2,
3185
        _ value3: T3,
3186
        _ value4: T4,
3187
        _ value5: T5,
3188
        _ value6: T6,
3189
        _ value7: T7,
3190
        _ value8: T8,
3191
        _ value9: T9,
3192
        _ value10: T10,
3193
        _ value11: T11,
3194
        _ value12: T12,
3195
        _ value13: T13,
3196
        _ value14: T14,
3197
        at index: Int,
3198
        endianness: Endianness = .big,
3199
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14).Type = (
3200
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14
3201
        ).self
3202
0
    ) -> Int {
3203
0
        var v1: T1
3204
0
        var v2: T2
3205
0
        var v3: T3
3206
0
        var v4: T4
3207
0
        var v5: T5
3208
0
        var v6: T6
3209
0
        var v7: T7
3210
0
        var v8: T8
3211
0
        var v9: T9
3212
0
        var v10: T10
3213
0
        var v11: T11
3214
0
        var v12: T12
3215
0
        var v13: T13
3216
0
        var v14: T14
3217
0
        switch endianness {
3218
0
        case .big:
3219
0
            v1 = value1.bigEndian
3220
0
            v2 = value2.bigEndian
3221
0
            v3 = value3.bigEndian
3222
0
            v4 = value4.bigEndian
3223
0
            v5 = value5.bigEndian
3224
0
            v6 = value6.bigEndian
3225
0
            v7 = value7.bigEndian
3226
0
            v8 = value8.bigEndian
3227
0
            v9 = value9.bigEndian
3228
0
            v10 = value10.bigEndian
3229
0
            v11 = value11.bigEndian
3230
0
            v12 = value12.bigEndian
3231
0
            v13 = value13.bigEndian
3232
0
            v14 = value14.bigEndian
3233
0
        case .little:
3234
0
            v1 = value1.littleEndian
3235
0
            v2 = value2.littleEndian
3236
0
            v3 = value3.littleEndian
3237
0
            v4 = value4.littleEndian
3238
0
            v5 = value5.littleEndian
3239
0
            v6 = value6.littleEndian
3240
0
            v7 = value7.littleEndian
3241
0
            v8 = value8.littleEndian
3242
0
            v9 = value9.littleEndian
3243
0
            v10 = value10.littleEndian
3244
0
            v11 = value11.littleEndian
3245
0
            v12 = value12.littleEndian
3246
0
            v13 = value13.littleEndian
3247
0
            v14 = value14.littleEndian
3248
0
        }
3249
0
3250
0
        var offset = index
3251
0
        var bytesWritten = 0
3252
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
3253
0
        offset = offset &+ MemoryLayout<T1>.size
3254
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
3255
0
        offset = offset &+ MemoryLayout<T2>.size
3256
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
3257
0
        offset = offset &+ MemoryLayout<T3>.size
3258
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
3259
0
        offset = offset &+ MemoryLayout<T4>.size
3260
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
3261
0
        offset = offset &+ MemoryLayout<T5>.size
3262
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
3263
0
        offset = offset &+ MemoryLayout<T6>.size
3264
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
3265
0
        offset = offset &+ MemoryLayout<T7>.size
3266
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
3267
0
        offset = offset &+ MemoryLayout<T8>.size
3268
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
3269
0
        offset = offset &+ MemoryLayout<T9>.size
3270
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
3271
0
        offset = offset &+ MemoryLayout<T10>.size
3272
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v11) { self.setBytes($0, at: offset) }
3273
0
        offset = offset &+ MemoryLayout<T11>.size
3274
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v12) { self.setBytes($0, at: offset) }
3275
0
        offset = offset &+ MemoryLayout<T12>.size
3276
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v13) { self.setBytes($0, at: offset) }
3277
0
        offset = offset &+ MemoryLayout<T13>.size
3278
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v14) { self.setBytes($0, at: offset) }
3279
0
        offset = offset &+ MemoryLayout<T14>.size
3280
0
        return bytesWritten
3281
0
    }
3282
3283
    @inlinable
3284
    @_alwaysEmitIntoClient
3285
    public mutating func readMultipleIntegers<
3286
        T1: FixedWidthInteger,
3287
        T2: FixedWidthInteger,
3288
        T3: FixedWidthInteger,
3289
        T4: FixedWidthInteger,
3290
        T5: FixedWidthInteger,
3291
        T6: FixedWidthInteger,
3292
        T7: FixedWidthInteger,
3293
        T8: FixedWidthInteger,
3294
        T9: FixedWidthInteger,
3295
        T10: FixedWidthInteger,
3296
        T11: FixedWidthInteger,
3297
        T12: FixedWidthInteger,
3298
        T13: FixedWidthInteger,
3299
        T14: FixedWidthInteger,
3300
        T15: FixedWidthInteger
3301
    >(
3302
        endianness: Endianness = .big,
3303
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15).Type = (
3304
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
3305
        ).self
3306
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)? {
3307
0
        guard let result = self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`) else {
3308
0
            return nil
3309
0
        }
3310
0
        var bytesRequired: Int = MemoryLayout<T1>.size
3311
0
        bytesRequired &+= MemoryLayout<T2>.size
3312
0
        bytesRequired &+= MemoryLayout<T3>.size
3313
0
        bytesRequired &+= MemoryLayout<T4>.size
3314
0
        bytesRequired &+= MemoryLayout<T5>.size
3315
0
        bytesRequired &+= MemoryLayout<T6>.size
3316
0
        bytesRequired &+= MemoryLayout<T7>.size
3317
0
        bytesRequired &+= MemoryLayout<T8>.size
3318
0
        bytesRequired &+= MemoryLayout<T9>.size
3319
0
        bytesRequired &+= MemoryLayout<T10>.size
3320
0
        bytesRequired &+= MemoryLayout<T11>.size
3321
0
        bytesRequired &+= MemoryLayout<T12>.size
3322
0
        bytesRequired &+= MemoryLayout<T13>.size
3323
0
        bytesRequired &+= MemoryLayout<T14>.size
3324
0
        bytesRequired &+= MemoryLayout<T15>.size
3325
0
        self._moveReaderIndex(forwardBy: bytesRequired)
3326
0
        return result
3327
0
    }
3328
3329
    @inlinable
3330
    @_alwaysEmitIntoClient
3331
    public func peekMultipleIntegers<
3332
        T1: FixedWidthInteger,
3333
        T2: FixedWidthInteger,
3334
        T3: FixedWidthInteger,
3335
        T4: FixedWidthInteger,
3336
        T5: FixedWidthInteger,
3337
        T6: FixedWidthInteger,
3338
        T7: FixedWidthInteger,
3339
        T8: FixedWidthInteger,
3340
        T9: FixedWidthInteger,
3341
        T10: FixedWidthInteger,
3342
        T11: FixedWidthInteger,
3343
        T12: FixedWidthInteger,
3344
        T13: FixedWidthInteger,
3345
        T14: FixedWidthInteger,
3346
        T15: FixedWidthInteger
3347
    >(
3348
        endianness: Endianness = .big,
3349
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15).Type = (
3350
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
3351
        ).self
3352
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)? {
3353
0
        self.getMultipleIntegers(at: self.readerIndex, endianness: endianness, as: `as`)
3354
0
    }
3355
3356
    @inlinable
3357
    @_alwaysEmitIntoClient
3358
    public func getMultipleIntegers<
3359
        T1: FixedWidthInteger,
3360
        T2: FixedWidthInteger,
3361
        T3: FixedWidthInteger,
3362
        T4: FixedWidthInteger,
3363
        T5: FixedWidthInteger,
3364
        T6: FixedWidthInteger,
3365
        T7: FixedWidthInteger,
3366
        T8: FixedWidthInteger,
3367
        T9: FixedWidthInteger,
3368
        T10: FixedWidthInteger,
3369
        T11: FixedWidthInteger,
3370
        T12: FixedWidthInteger,
3371
        T13: FixedWidthInteger,
3372
        T14: FixedWidthInteger,
3373
        T15: FixedWidthInteger
3374
    >(
3375
        at index: Int,
3376
        endianness: Endianness = .big,
3377
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15).Type = (
3378
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
3379
        ).self
3380
0
    ) -> (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)? {
3381
0
        var bytesRequired: Int = MemoryLayout<T1>.size
3382
0
        bytesRequired &+= MemoryLayout<T2>.size
3383
0
        bytesRequired &+= MemoryLayout<T3>.size
3384
0
        bytesRequired &+= MemoryLayout<T4>.size
3385
0
        bytesRequired &+= MemoryLayout<T5>.size
3386
0
        bytesRequired &+= MemoryLayout<T6>.size
3387
0
        bytesRequired &+= MemoryLayout<T7>.size
3388
0
        bytesRequired &+= MemoryLayout<T8>.size
3389
0
        bytesRequired &+= MemoryLayout<T9>.size
3390
0
        bytesRequired &+= MemoryLayout<T10>.size
3391
0
        bytesRequired &+= MemoryLayout<T11>.size
3392
0
        bytesRequired &+= MemoryLayout<T12>.size
3393
0
        bytesRequired &+= MemoryLayout<T13>.size
3394
0
        bytesRequired &+= MemoryLayout<T14>.size
3395
0
        bytesRequired &+= MemoryLayout<T15>.size
3396
0
3397
0
        guard let range = self.rangeWithinReadableBytes(index: index, length: bytesRequired) else {
3398
0
            return nil
3399
0
        }
3400
0
3401
0
        var v1: T1 = 0
3402
0
        var v2: T2 = 0
3403
0
        var v3: T3 = 0
3404
0
        var v4: T4 = 0
3405
0
        var v5: T5 = 0
3406
0
        var v6: T6 = 0
3407
0
        var v7: T7 = 0
3408
0
        var v8: T8 = 0
3409
0
        var v9: T9 = 0
3410
0
        var v10: T10 = 0
3411
0
        var v11: T11 = 0
3412
0
        var v12: T12 = 0
3413
0
        var v13: T13 = 0
3414
0
        var v14: T14 = 0
3415
0
        var v15: T15 = 0
3416
0
        var offset = range.lowerBound
3417
0
        self.withUnsafeReadableBytes { ptr in
3418
0
            assert(ptr.count >= range.lowerBound + bytesRequired)
3419
0
            let basePtr = ptr.baseAddress!  // safe, ptr is non-empty
3420
0
            withUnsafeMutableBytes(of: &v1) { destPtr in
3421
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T1>.size)
3422
0
            }
3423
0
            offset = offset &+ MemoryLayout<T1>.size
3424
0
            withUnsafeMutableBytes(of: &v2) { destPtr in
3425
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T2>.size)
3426
0
            }
3427
0
            offset = offset &+ MemoryLayout<T2>.size
3428
0
            withUnsafeMutableBytes(of: &v3) { destPtr in
3429
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T3>.size)
3430
0
            }
3431
0
            offset = offset &+ MemoryLayout<T3>.size
3432
0
            withUnsafeMutableBytes(of: &v4) { destPtr in
3433
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T4>.size)
3434
0
            }
3435
0
            offset = offset &+ MemoryLayout<T4>.size
3436
0
            withUnsafeMutableBytes(of: &v5) { destPtr in
3437
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T5>.size)
3438
0
            }
3439
0
            offset = offset &+ MemoryLayout<T5>.size
3440
0
            withUnsafeMutableBytes(of: &v6) { destPtr in
3441
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T6>.size)
3442
0
            }
3443
0
            offset = offset &+ MemoryLayout<T6>.size
3444
0
            withUnsafeMutableBytes(of: &v7) { destPtr in
3445
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T7>.size)
3446
0
            }
3447
0
            offset = offset &+ MemoryLayout<T7>.size
3448
0
            withUnsafeMutableBytes(of: &v8) { destPtr in
3449
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T8>.size)
3450
0
            }
3451
0
            offset = offset &+ MemoryLayout<T8>.size
3452
0
            withUnsafeMutableBytes(of: &v9) { destPtr in
3453
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T9>.size)
3454
0
            }
3455
0
            offset = offset &+ MemoryLayout<T9>.size
3456
0
            withUnsafeMutableBytes(of: &v10) { destPtr in
3457
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T10>.size)
3458
0
            }
3459
0
            offset = offset &+ MemoryLayout<T10>.size
3460
0
            withUnsafeMutableBytes(of: &v11) { destPtr in
3461
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T11>.size)
3462
0
            }
3463
0
            offset = offset &+ MemoryLayout<T11>.size
3464
0
            withUnsafeMutableBytes(of: &v12) { destPtr in
3465
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T12>.size)
3466
0
            }
3467
0
            offset = offset &+ MemoryLayout<T12>.size
3468
0
            withUnsafeMutableBytes(of: &v13) { destPtr in
3469
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T13>.size)
3470
0
            }
3471
0
            offset = offset &+ MemoryLayout<T13>.size
3472
0
            withUnsafeMutableBytes(of: &v14) { destPtr in
3473
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T14>.size)
3474
0
            }
3475
0
            offset = offset &+ MemoryLayout<T14>.size
3476
0
            withUnsafeMutableBytes(of: &v15) { destPtr in
3477
0
                destPtr.baseAddress!.copyMemory(from: basePtr + offset, byteCount: MemoryLayout<T15>.size)
3478
0
            }
3479
0
            offset = offset &+ MemoryLayout<T15>.size
3480
0
            assert(offset == range.upperBound)
3481
0
        }
3482
0
        switch endianness {
3483
0
        case .big:
3484
0
            return (
3485
0
                T1(bigEndian: v1), T2(bigEndian: v2), T3(bigEndian: v3), T4(bigEndian: v4), T5(bigEndian: v5),
3486
0
                T6(bigEndian: v6), T7(bigEndian: v7), T8(bigEndian: v8), T9(bigEndian: v9), T10(bigEndian: v10),
3487
0
                T11(bigEndian: v11), T12(bigEndian: v12), T13(bigEndian: v13), T14(bigEndian: v14), T15(bigEndian: v15)
3488
0
            )
3489
0
        case .little:
3490
0
            return (
3491
0
                T1(littleEndian: v1), T2(littleEndian: v2), T3(littleEndian: v3), T4(littleEndian: v4),
3492
0
                T5(littleEndian: v5), T6(littleEndian: v6), T7(littleEndian: v7), T8(littleEndian: v8),
3493
0
                T9(littleEndian: v9), T10(littleEndian: v10), T11(littleEndian: v11), T12(littleEndian: v12),
3494
0
                T13(littleEndian: v13), T14(littleEndian: v14), T15(littleEndian: v15)
3495
0
            )
3496
0
        }
3497
0
    }
3498
3499
    @inlinable
3500
    @_alwaysEmitIntoClient
3501
    @discardableResult
3502
    public mutating func writeMultipleIntegers<
3503
        T1: FixedWidthInteger,
3504
        T2: FixedWidthInteger,
3505
        T3: FixedWidthInteger,
3506
        T4: FixedWidthInteger,
3507
        T5: FixedWidthInteger,
3508
        T6: FixedWidthInteger,
3509
        T7: FixedWidthInteger,
3510
        T8: FixedWidthInteger,
3511
        T9: FixedWidthInteger,
3512
        T10: FixedWidthInteger,
3513
        T11: FixedWidthInteger,
3514
        T12: FixedWidthInteger,
3515
        T13: FixedWidthInteger,
3516
        T14: FixedWidthInteger,
3517
        T15: FixedWidthInteger
3518
    >(
3519
        _ value1: T1,
3520
        _ value2: T2,
3521
        _ value3: T3,
3522
        _ value4: T4,
3523
        _ value5: T5,
3524
        _ value6: T6,
3525
        _ value7: T7,
3526
        _ value8: T8,
3527
        _ value9: T9,
3528
        _ value10: T10,
3529
        _ value11: T11,
3530
        _ value12: T12,
3531
        _ value13: T13,
3532
        _ value14: T14,
3533
        _ value15: T15,
3534
        endianness: Endianness = .big,
3535
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15).Type = (
3536
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
3537
        ).self
3538
0
    ) -> Int {
3539
0
        let bytesWritten = self.setMultipleIntegers(
3540
0
            value1,
3541
0
            value2,
3542
0
            value3,
3543
0
            value4,
3544
0
            value5,
3545
0
            value6,
3546
0
            value7,
3547
0
            value8,
3548
0
            value9,
3549
0
            value10,
3550
0
            value11,
3551
0
            value12,
3552
0
            value13,
3553
0
            value14,
3554
0
            value15,
3555
0
            at: self.writerIndex,
3556
0
            endianness: endianness,
3557
0
            as: `as`
3558
0
        )
3559
0
        self._moveWriterIndex(forwardBy: bytesWritten)
3560
0
        return bytesWritten
3561
0
    }
3562
3563
    @inlinable
3564
    @_alwaysEmitIntoClient
3565
    @discardableResult
3566
    public mutating func setMultipleIntegers<
3567
        T1: FixedWidthInteger,
3568
        T2: FixedWidthInteger,
3569
        T3: FixedWidthInteger,
3570
        T4: FixedWidthInteger,
3571
        T5: FixedWidthInteger,
3572
        T6: FixedWidthInteger,
3573
        T7: FixedWidthInteger,
3574
        T8: FixedWidthInteger,
3575
        T9: FixedWidthInteger,
3576
        T10: FixedWidthInteger,
3577
        T11: FixedWidthInteger,
3578
        T12: FixedWidthInteger,
3579
        T13: FixedWidthInteger,
3580
        T14: FixedWidthInteger,
3581
        T15: FixedWidthInteger
3582
    >(
3583
        _ value1: T1,
3584
        _ value2: T2,
3585
        _ value3: T3,
3586
        _ value4: T4,
3587
        _ value5: T5,
3588
        _ value6: T6,
3589
        _ value7: T7,
3590
        _ value8: T8,
3591
        _ value9: T9,
3592
        _ value10: T10,
3593
        _ value11: T11,
3594
        _ value12: T12,
3595
        _ value13: T13,
3596
        _ value14: T14,
3597
        _ value15: T15,
3598
        at index: Int,
3599
        endianness: Endianness = .big,
3600
        as: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15).Type = (
3601
            T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
3602
        ).self
3603
0
    ) -> Int {
3604
0
        var v1: T1
3605
0
        var v2: T2
3606
0
        var v3: T3
3607
0
        var v4: T4
3608
0
        var v5: T5
3609
0
        var v6: T6
3610
0
        var v7: T7
3611
0
        var v8: T8
3612
0
        var v9: T9
3613
0
        var v10: T10
3614
0
        var v11: T11
3615
0
        var v12: T12
3616
0
        var v13: T13
3617
0
        var v14: T14
3618
0
        var v15: T15
3619
0
        switch endianness {
3620
0
        case .big:
3621
0
            v1 = value1.bigEndian
3622
0
            v2 = value2.bigEndian
3623
0
            v3 = value3.bigEndian
3624
0
            v4 = value4.bigEndian
3625
0
            v5 = value5.bigEndian
3626
0
            v6 = value6.bigEndian
3627
0
            v7 = value7.bigEndian
3628
0
            v8 = value8.bigEndian
3629
0
            v9 = value9.bigEndian
3630
0
            v10 = value10.bigEndian
3631
0
            v11 = value11.bigEndian
3632
0
            v12 = value12.bigEndian
3633
0
            v13 = value13.bigEndian
3634
0
            v14 = value14.bigEndian
3635
0
            v15 = value15.bigEndian
3636
0
        case .little:
3637
0
            v1 = value1.littleEndian
3638
0
            v2 = value2.littleEndian
3639
0
            v3 = value3.littleEndian
3640
0
            v4 = value4.littleEndian
3641
0
            v5 = value5.littleEndian
3642
0
            v6 = value6.littleEndian
3643
0
            v7 = value7.littleEndian
3644
0
            v8 = value8.littleEndian
3645
0
            v9 = value9.littleEndian
3646
0
            v10 = value10.littleEndian
3647
0
            v11 = value11.littleEndian
3648
0
            v12 = value12.littleEndian
3649
0
            v13 = value13.littleEndian
3650
0
            v14 = value14.littleEndian
3651
0
            v15 = value15.littleEndian
3652
0
        }
3653
0
3654
0
        var offset = index
3655
0
        var bytesWritten = 0
3656
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v1) { self.setBytes($0, at: offset) }
3657
0
        offset = offset &+ MemoryLayout<T1>.size
3658
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v2) { self.setBytes($0, at: offset) }
3659
0
        offset = offset &+ MemoryLayout<T2>.size
3660
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v3) { self.setBytes($0, at: offset) }
3661
0
        offset = offset &+ MemoryLayout<T3>.size
3662
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v4) { self.setBytes($0, at: offset) }
3663
0
        offset = offset &+ MemoryLayout<T4>.size
3664
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v5) { self.setBytes($0, at: offset) }
3665
0
        offset = offset &+ MemoryLayout<T5>.size
3666
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v6) { self.setBytes($0, at: offset) }
3667
0
        offset = offset &+ MemoryLayout<T6>.size
3668
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v7) { self.setBytes($0, at: offset) }
3669
0
        offset = offset &+ MemoryLayout<T7>.size
3670
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v8) { self.setBytes($0, at: offset) }
3671
0
        offset = offset &+ MemoryLayout<T8>.size
3672
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v9) { self.setBytes($0, at: offset) }
3673
0
        offset = offset &+ MemoryLayout<T9>.size
3674
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v10) { self.setBytes($0, at: offset) }
3675
0
        offset = offset &+ MemoryLayout<T10>.size
3676
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v11) { self.setBytes($0, at: offset) }
3677
0
        offset = offset &+ MemoryLayout<T11>.size
3678
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v12) { self.setBytes($0, at: offset) }
3679
0
        offset = offset &+ MemoryLayout<T12>.size
3680
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v13) { self.setBytes($0, at: offset) }
3681
0
        offset = offset &+ MemoryLayout<T13>.size
3682
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v14) { self.setBytes($0, at: offset) }
3683
0
        offset = offset &+ MemoryLayout<T14>.size
3684
0
        bytesWritten &+= Swift.withUnsafeBytes(of: &v15) { self.setBytes($0, at: offset) }
3685
0
        offset = offset &+ MemoryLayout<T15>.size
3686
0
        return bytesWritten
3687
0
    }
3688
3689
}