Skip to content

Commit e049fe6

Browse files
committed
Add EvalResult and clean up implementation of withUnsafeCStringBuffer
1 parent b4eef4d commit e049fe6

File tree

2 files changed

+43
-43
lines changed

2 files changed

+43
-43
lines changed

Sources/Clang/EvalResult.swift

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,63 +2,64 @@
22
import cclang
33
#endif
44

5-
protocol EvalResultKind {
5+
protocol EvalResult {
66
var clang: CXEvalResult { get }
77
}
88

9-
public struct IntResult: EvalResultKind {
9+
public struct IntResult: EvalResult {
1010
let clang: CXEvalResult
1111
public var value: Int {
1212
return Int(clang_EvalResult_getAsInt(clang))
1313
}
1414
}
1515

16-
public struct FloatResult: EvalResultKind {
16+
public struct FloatResult: EvalResult {
1717
let clang: CXEvalResult
1818
public var value: Double {
19-
return Double(clang_EvalResult_getAsDouble(clang))
19+
return clang_EvalResult_getAsDouble(clang)
2020
}
2121
}
2222

23-
public struct ObjCStrLiteralResult: EvalResultKind {
23+
public struct ObjCStrLiteralResult: EvalResult {
2424
let clang: CXEvalResult
2525
public var value: String {
2626
return String(cString: clang_EvalResult_getAsStr(clang))
2727
}
2828
}
2929

30-
public struct StrLiteralResult: EvalResultKind {
30+
public struct StrLiteralResult: EvalResult {
3131
let clang: CXEvalResult
3232
public var value: String {
3333
return String(cString: clang_EvalResult_getAsStr(clang))
3434
}
3535
}
3636

37-
public struct CFStrResult: EvalResultKind {
37+
public struct CFStrResult: EvalResult {
3838
let clang: CXEvalResult
3939
public var value: String {
4040
return String(cString: clang_EvalResult_getAsStr(clang))
4141
}
4242
}
4343

44-
public struct OtherResult: EvalResultKind {
44+
public struct OtherResult: EvalResult {
4545
let clang: CXEvalResult
4646
}
4747

48-
public struct UnExposedResult: EvalResultKind {
48+
public struct UnExposedResult: EvalResult {
4949
let clang: CXEvalResult
5050
}
5151

52-
/// Converts a CXEvalResultKind to a EvalResultKind, returning `nil` if it was unsuccessful
53-
func convertEvalResultKind(_ clang: CXEvalResult) -> EvalResultKind? {
54-
switch clang_EvalResult_getKind(clang) {
52+
/// Converts a CXEvalResult to a EvalResult, returning `nil` if it was unsuccessful
53+
func convertEvalResult(_ clang: CXEvalResult) -> EvalResult? {
54+
let kind = clang_EvalResult_getKind(clang)
55+
switch kind {
5556
case CXEval_Int: return IntResult(clang: clang)
5657
case CXEval_Float: return FloatResult(clang: clang)
5758
case CXEval_ObjCStrLiteral: return ObjCStrLiteralResult(clang: clang)
5859
case CXEval_StrLiteral: return StrLiteralResult(clang: clang)
5960
case CXEval_CFStr: return CFStrResult(clang: clang)
6061
case CXEval_Other: return OtherResult(clang: clang)
6162
case CXEval_UnExposed: return UnExposedResult(clang: clang)
62-
default: fatalError("invalid CXEvalResultKindKind \(clang)")
63+
default: fatalError("invalid CXEvalResultKind \(clang)")
6364
}
6465
}

Sources/Clang/Utilities.swift

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,47 @@
11
#if !NO_SWIFTPM
2-
import cclang
2+
import cclang
33
#endif
44

55
internal extension Bool {
6-
func asClang() -> Int32 {
7-
return self ? 1 : 0
8-
}
6+
func asClang() -> Int32 {
7+
return self ? 1 : 0
8+
}
99
}
1010

1111

1212
extension CXString {
13-
func asSwiftOptional() -> String? {
14-
guard let cStr = clang_getCString(self) else { return nil }
15-
defer { clang_disposeString(self) }
16-
return String(cString: cStr)
17-
}
18-
func asSwift() -> String {
19-
return asSwiftOptional() ?? ""
20-
}
13+
func asSwiftOptional() -> String? {
14+
guard let cStr = clang_getCString(self) else { return nil }
15+
defer { clang_disposeString(self) }
16+
return String(cString: cStr)
17+
}
18+
func asSwift() -> String {
19+
return asSwiftOptional() ?? ""
20+
}
2121
}
2222

2323
extension Collection where Iterator.Element == String, IndexDistance == Int {
24-
func withUnsafeCStringBuffer<Result>(_ f: @escaping (UnsafeMutableBufferPointer<UnsafePointer<Int8>?>) throws -> Result) rethrows -> Result {
25-
let ptr = UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>.allocate(capacity: self.count)
26-
defer { freelist(ptr, count: self.count) }
27-
for (idx, str) in enumerated() {
28-
str.withCString { cStr in
29-
ptr[idx] = strdup(cStr)
30-
}
31-
}
32-
return try ptr.withMemoryRebound(to: Optional<UnsafePointer<Int8>>.self, capacity: self.count) { constPtr in
33-
return try f(UnsafeMutableBufferPointer(start: constPtr, count: self.count))
24+
25+
func withUnsafeCStringBuffer<Result>(_ f: (UnsafeMutableBufferPointer<UnsafePointer<Int8>?>) throws -> Result) rethrows -> Result {
26+
var arr = [UnsafePointer<Int8>?]()
27+
defer {
28+
for cStr in arr {
29+
free(UnsafeMutablePointer(mutating: cStr))
3430
}
3531
}
36-
}
37-
38-
func freelist<T>(_ ptr: UnsafeMutablePointer<UnsafeMutablePointer<T>?>, count: Int) {
39-
for i in 0..<count {
40-
free(ptr[i])
32+
for str in self {
33+
str.withCString { cStr in
34+
arr.append(UnsafePointer(strdup(cStr)))
35+
}
36+
}
37+
return try arr.withUnsafeMutableBufferPointer { buf in
38+
return try f(UnsafeMutableBufferPointer(start: buf.baseAddress,
39+
count: buf.count))
4140
}
42-
free(ptr)
41+
}
4342
}
4443

4544
internal class Box<T> {
46-
public var value: T
47-
init(_ value: T) { self.value = value }
45+
public var value: T
46+
init(_ value: T) { self.value = value }
4847
}

0 commit comments

Comments
 (0)