File: Emit.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 (111 lines) | stat: -rw-r--r-- 2,696 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 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
//
//===----------------------------------------------------------------------===//

public func emitCollection<C: Collection>(
  _ collection: C,
  name: String,
  type: String,
  into result: inout String,
  formatter: (C.Element) -> String
) {
  result += """
  static const \(type) \(name)[\(collection.count)] = {
  
  """
  
  formatCollection(collection, into: &result, using: formatter)
  
  result += "\n};\n\n"
}

public func emitCollection<C: Collection>(
  _ collection: C,
  name: String,
  into result: inout String
) where C.Element: FixedWidthInteger {
  emitCollection(
    collection,
    name: name,
    type: "__swift_\(C.Element.isSigned ? "" : "u")int\(C.Element.bitWidth)_t",
    into: &result
  ) {
    "0x\(String($0, radix: 16, uppercase: true))"
  }
}

// Emits an abstract minimal perfect hash function into C arrays.
public func emitMph(
  _ mph: Mph,
  name: String,
  defineLabel: String,
  into result: inout String
) {
  result += """
  #define \(defineLabel)_LEVEL_COUNT \(mph.bitArrays.count)
  
  
  """
  
  emitMphSizes(mph, name, into: &result)
  emitMphBitarrays(mph, name, into: &result)
  emitMphRanks(mph, name, into: &result)
}

// BitArray sizes
func emitMphSizes(_ mph: Mph, _ name: String, into result: inout String) {
  emitCollection(
    mph.bitArrays,
    name: "\(name)_sizes",
    type: "__swift_uint16_t",
    into: &result
  ) {
    "0x\(String($0.size, radix: 16, uppercase: true))"
  }
}

func emitMphBitarrays(_ mph: Mph, _ name: String, into result: inout String) {
  // Individual bitarrays
  
  for (i, ba) in mph.bitArrays.enumerated() {
    emitCollection(ba.words, name: "\(name)_keys\(i)", into: &result)
  }
  
  // Overall bitarrays
  
  emitCollection(
    mph.bitArrays.indices,
    name: "\(name)_keys",
    type: "__swift_uint64_t * const",
    into: &result
  ) {
    "\(name)_keys\($0)"
  }
}

func emitMphRanks(_ mph: Mph, _ name: String, into result: inout String) {
  // Individual ranks
  
  for (i, rank) in mph.ranks.enumerated() {
    emitCollection(rank, name: "\(name)_ranks\(i)", into: &result)
  }
  
  // Overall ranks
  
  emitCollection(
    mph.ranks.indices,
    name: "\(name)_ranks",
    type: "__swift_uint16_t * const",
    into: &result
  ) {
    "\(name)_ranks\($0)"
  }
}