  
     Low level 3 dimensional Coorodinate type with an m value.
  */
-public class Coordinate3DM : Coordinate, ThreeDimensional, Measured, TupleConvertable {
-    
-    public typealias TupleType = (x: Double, y: Double, z: Double, m: Double)
+public final class Coordinate3DM : Coordinate, ThreeDimensional, Measured {
     
     public let x: Double
     public let y: Double
     public let z: Double
     public let m: Double
     
-    public var tuple: TupleType {
-        get { return (x: self.x, y: self.y, z: self.z, m: self.m)  }
-    }
-    
-    public required init(tuple: TupleType) {
-        self.x = tuple.x
-        self.y = tuple.y
-        self.z = tuple.z
-        self.m = tuple.m
-    }
-
-    public required init(tuple: TupleType, precision: Precision) {
-        self.x = precision.convert(tuple.x)
-        self.y = precision.convert(tuple.y)
-        self.z = precision.convert(tuple.z)
-        self.m = precision.convert(tuple.m)
+    public required init(x: Double, y: Double, z: Double, m: Double) {
+        self.x = x
+        self.y = y
+        self.z = z
+        self.m = m
     }
     
     public required init(other: Coordinate3DM) {

    
}

public func ==(lhs: Coordinate3DM, rhs: Coordinate3DM) -> Bool {
    return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.m == rhs.m
}

extension Coordinate3DM : CustomStringConvertible, CustomDebugStringConvertible {

    }
    
    public var debugDescription : String {
        return Sring() + self.description
    }
}

public func ==(lhs: Coordinate3DM, rhs: Coordinate3DM) -> Bool {
    return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.m == rhs.m
}
