File: BinaryEncoder.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (59 lines) | stat: -rw-r--r-- 2,103 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import Foundation

package struct BinaryEncoder {
  private var stream: [UInt8] = []
  static let maximumUnderstoodStreamVersion = 0
  let contentVersion: Int

  private init(contentVersion: Int) {
    self.contentVersion = contentVersion
    write(Self.maximumUnderstoodStreamVersion)
    write(contentVersion)
  }

  /// Top level function to begin encoding.
  /// - Parameters:
  ///   - contentVersion: A version number for the content of the whole archive.
  ///   - body: a closure accepting a `BinaryEncoder` that you can make `write(_:)` calls against to populate the
  ///   archive.
  /// - Returns: a byte array that can be used with `BinaryDecoder`
  static func encode(contentVersion: Int, _ body: (inout Self) -> ()) -> [UInt8] {
    var encoder = BinaryEncoder(contentVersion: contentVersion)
    body(&encoder)
    return encoder.stream
  }

  /// Write the literal bytes of `value` into the archive. The client is responsible for any endian or architecture
  /// sizing considerations.
  mutating func write<V>(rawBytesOf value: V) {
    withUnsafeBytes(of: value) { valueBytes in
      write(rawBytes: valueBytes)
    }
  }

  /// Write `rawBytes` into the archive. You might use this to encode the contents of a bitmap, or a UTF8 sequence.
  mutating func write<C: Collection>(rawBytes: C) where C.Element == UInt8 {
    stream.append(contentsOf: rawBytes)
  }

  mutating func writeByte(_ value: UInt8) {
    write(value)
  }

  /// Recursively encode `value` and all of it's contents.
  mutating func write<V: BinaryCodable>(_ value: V) {
    value.encode(&self)
  }
}