Skip to content

Instantly share code, notes, and snippets.

@ishikawa
Created August 3, 2014 00:25
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ishikawa/c3917ea4daa107f1ce68 to your computer and use it in GitHub Desktop.
Save ishikawa/c3917ea4daa107f1ce68 to your computer and use it in GitHub Desktop.
import Foundation
protocol EndianConvertible {
typealias IntegerType
init(bigEndian value: IntegerType)
init(littleEndian value: IntegerType)
var bigEndian: IntegerType { get }
var littleEndian: IntegerType { get }
var byteSwapped: IntegerType { get }
}
extension Int16 : EndianConvertible {}
extension Int32 : EndianConvertible {}
extension Int64 : EndianConvertible {}
extension UInt16 : EndianConvertible {}
extension UInt32 : EndianConvertible {}
extension UInt64 : EndianConvertible {}
extension NSInputStream {
func read<T : Integer>() -> T? {
var buffer : T = 0
let n = withUnsafePointer(&buffer) { (p) in
self.read(UnsafePointer<UInt8>(p), maxLength: sizeof(T))
}
if n > 0 {
assert(n == sizeof(T), "read length must be sizeof(T)")
return buffer
} else {
return nil
}
}
func readNetworkBytes<T : EndianConvertible where T.IntegerType : Integer>() -> T? {
if let value : T.IntegerType = self.read() {
return T(bigEndian: value)
}
return nil
}
func readNetworkBytes() -> UInt8? { return self.read() }
func readNetworkBytes() -> Int8? { return self.read() }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment