You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.8 KiB
Swift

//
// Tools used for mundane stuff
//
import Foundation
// Global function
func XCTAssertEqual(test: String, withExpression isTrue: Bool) {
if (isTrue) {
print("Pass ", terminator: " : ")
} else {
print("* F A I L *", terminator: " : ")
}
print(test)
}
func == <T:Equatable> (tuple1:(T,T),tuple2:(T,T)) -> Bool
{
return (tuple1.0 == tuple2.0) && (tuple1.1 == tuple2.1)
}
struct GridPoint: Equatable, Comparable, Hashable {
var X = 0
var Y = 0
var hashValue: Int {
get {
return X.hashValue ^ Y.hashValue
}
}
static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
return (lhs.X == rhs.X) && (lhs.Y == rhs.Y)
}
static func < (lhs: GridPoint, rhs: GridPoint) -> Bool {
return lhs.Y == rhs.Y ? lhs.X < rhs.X : lhs.Y < rhs.Y
}
}
struct Tools {
static func readFile(fromPath path: String) -> String {
var retVal = ""
do {
let data = try NSString(contentsOfFile: path, encoding: String.Encoding.ascii.rawValue)
retVal = data as String
}
catch let error as NSError {
print("Tools readFile(fromPath: \"\(path)\") error: \(error)")
}
return retVal
}
// Assumes THE string is 'polymer'
static func stringIndexRange(withString str: String, fromRange range: Range<Int>) -> Range<String.Index> {
let myrange = Range(uncheckedBounds: (lower: max(0, min(str.length, range.lowerBound)), upper: min(str.length, max(0, range.upperBound))))
let start = str.index(str.startIndex, offsetBy: myrange.lowerBound)
let end = str.index(start, offsetBy: myrange.upperBound - myrange.lowerBound)
return start ..< end
}
}
extension Character {
var isAscii: Bool {
return unicodeScalars.first?.isASCII == true
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
// var string: String { return String(self) }
var ascii: [UInt32] {
return compactMap { $0.ascii }
}
subscript(offset: Int) -> Element {
return self[index(startIndex, offsetBy: offset)]
}
}
extension String {
var length: Int {
return count
}
subscript (i: Int) -> String {
return self[i ..< i + 1]
}
func substring(fromIndex: Int) -> String {
return self[min(fromIndex, length) ..< length]
}
func substring(toIndex: Int) -> String {
return self[0 ..< max(0, toIndex)]
}
subscript (r: Range<Int>) -> String {
let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)),
upper: min(length, max(0, r.upperBound))))
let start = index(startIndex, offsetBy: range.lowerBound)
let end = index(start, offsetBy: range.upperBound - range.lowerBound)
return String(self[start ..< end])
}
}