Skip to content

Instantly share code, notes, and snippets.

@igrechuhin
Created October 6, 2021 14:41
Show Gist options
  • Select an option

  • Save igrechuhin/863b8cc3768a96cd951fde8913412aa5 to your computer and use it in GitHub Desktop.

Select an option

Save igrechuhin/863b8cc3768a96cd951fde8913412aa5 to your computer and use it in GitHub Desktop.
DebugPrinter
final class DebugPrinter {
private var address2Name: [UnsafeMutableRawPointer: String] = [:]
private var typeIndex: [String: Int] = [:]
private let marker: String
private let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss.SSS"
return formatter
}()
private var now: String {
formatter.string(from: Date())
}
init(marker: String = "[T]") {
self.marker = marker
}
func add<Instance>(_ object: Instance?, name: String? = nil) {
guard let object = object else { return }
let pointer = Unmanaged.passUnretained(object as AnyObject).toOpaque()
guard address2Name[pointer] == nil else { return }
let name = name ?? String(describing: type(of: object))
typeIndex[name, default: 0] += 1
let index = typeIndex[name]!
address2Name[pointer] = "<\(name) #\(index)>"
}
func print<Instance>(
_ object: Instance?,
function: String = #function,
_ extra: String = ""
) {
Swift.print(marker, now, "\(name(object)).\(function)", extra)
}
func name<Instance>(_ object: Instance?) -> String {
let typeName = String(describing: type(of: object))
guard let object = object else { return "\(typeName).nil" }
add(object)
let pointer = Unmanaged.passUnretained(object as AnyObject).toOpaque()
return address2Name[pointer]!
}
}
let debugPrinter = DebugPrinter()
@igrechuhin
Copy link
Author

igrechuhin commented Oct 6, 2021

debugPrinter.print(self, "\(debugPrinter.name(oldValue)) -> \(debugPrinter.name(owner))")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment