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)"
}
}
|