Skip to content

Instantly share code, notes, and snippets.

@gurgeous
Last active April 13, 2021 15:52
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save gurgeous/bc0c3d2e748c3b6fe7f2 to your computer and use it in GitHub Desktop.
Save gurgeous/bc0c3d2e748c3b6fe7f2 to your computer and use it in GitHub Desktop.
missing operators for CGPoint, CGSize and CGRect
//
// MARK: CGPoint op point/size/float
//
func -(l: CGPoint, r: CGPoint) -> CGPoint { return CGPoint(x: l.x - r.x, y: l.y - r.y) }
func +(l: CGPoint, r: CGPoint) -> CGPoint { return CGPoint(x: l.x + r.x, y: l.y + r.y) }
func *(l: CGPoint, r: CGPoint) -> CGPoint { return CGPoint(x: l.x * r.x, y: l.y * r.y) }
func /(l: CGPoint, r: CGPoint) -> CGPoint { return CGPoint(x: l.x / r.x, y: l.y / r.y) }
func -(l: CGPoint, r: CGSize) -> CGPoint { return CGPoint(x: l.x - r.width, y: l.y - r.height) }
func +(l: CGPoint, r: CGSize) -> CGPoint { return CGPoint(x: l.x + r.width, y: l.y + r.height) }
func *(l: CGPoint, r: CGSize) -> CGPoint { return CGPoint(x: l.x * r.width, y: l.y * r.height) }
func /(l: CGPoint, r: CGSize) -> CGPoint { return CGPoint(x: l.x / r.width, y: l.y / r.height) }
func -(l: CGPoint, r: CGFloat) -> CGPoint { return CGPoint(x: l.x - r, y: l.y - r) }
func +(l: CGPoint, r: CGFloat) -> CGPoint { return CGPoint(x: l.x + r, y: l.y + r) }
func *(l: CGPoint, r: CGFloat) -> CGPoint { return CGPoint(x: l.x * r, y: l.y * r) }
func /(l: CGPoint, r: CGFloat) -> CGPoint { return CGPoint(x: l.x / r, y: l.y / r) }
func -=(inout l: CGPoint, r: CGPoint) { l = l - r }
func +=(inout l: CGPoint, r: CGPoint) { l = l + r }
func *=(inout l: CGPoint, r: CGPoint) { l = l * r }
func /=(inout l: CGPoint, r: CGPoint) { l = l / r }
func -=(inout l: CGPoint, r: CGSize) { l = l - r }
func +=(inout l: CGPoint, r: CGSize) { l = l + r }
func *=(inout l: CGPoint, r: CGSize) { l = l * r }
func /=(inout l: CGPoint, r: CGSize) { l = l / r }
func -=(inout l: CGPoint, r: CGFloat) { l = l - r }
func +=(inout l: CGPoint, r: CGFloat) { l = l + r }
func *=(inout l: CGPoint, r: CGFloat) { l = l * r }
func /=(inout l: CGPoint, r: CGFloat) { l = l / r }
extension CGPoint {
init(x: CGFloat) {
self.x = x
self.y = 0
}
init(y: CGFloat) {
self.x = 0
self.y = y
}
func with(#x: CGFloat) -> CGPoint {
return CGPoint(x: x, y: y)
}
func with(#y: CGFloat) -> CGPoint {
return CGPoint(x: x, y: y)
}
func ceil() -> CGPoint {
return CGPoint(x: CoreGraphics.ceil(x), y: CoreGraphics.ceil(y))
}
func floor() -> CGPoint {
return CGPoint(x: CoreGraphics.floor(x), y: CoreGraphics.floor(y))
}
func round() -> CGPoint {
return CGPoint(x: CoreGraphics.round(x), y: CoreGraphics.round(y))
}
func size() -> CGSize {
return CGSize(width: x, height: y)
}
func toInts() -> (x: Int, y: Int) {
return (x: Int(x), y: Int(y))
}
}
//
// MARK: CGSize op size/float
//
func -(l: CGSize, r: CGSize) -> CGSize { return CGSize(width: l.width - r.width, height: l.height - r.height) }
func +(l: CGSize, r: CGSize) -> CGSize { return CGSize(width: l.width + r.width, height: l.height + r.height) }
func *(l: CGSize, r: CGSize) -> CGSize { return CGSize(width: l.width * r.width, height: l.height * r.height) }
func /(l: CGSize, r: CGSize) -> CGSize { return CGSize(width: l.width / r.width, height: l.height / r.height) }
func -(l: CGSize, r: CGFloat) -> CGSize { return CGSize(width: l.width - r, height: l.height - r) }
func +(l: CGSize, r: CGFloat) -> CGSize { return CGSize(width: l.width + r, height: l.height + r) }
func *(l: CGSize, r: CGFloat) -> CGSize { return CGSize(width: l.width * r, height: l.height * r) }
func /(l: CGSize, r: CGFloat) -> CGSize { return CGSize(width: l.width / r, height: l.height / r) }
func -=(inout l: CGSize, r: CGSize) { l = l - r }
func +=(inout l: CGSize, r: CGSize) { l = l + r }
func *=(inout l: CGSize, r: CGSize) { l = l * r }
func /=(inout l: CGSize, r: CGSize) { l = l / r }
func -=(inout l: CGSize, r: CGFloat) { l = l - r }
func +=(inout l: CGSize, r: CGFloat) { l = l + r }
func *=(inout l: CGSize, r: CGFloat) { l = l * r }
func /=(inout l: CGSize, r: CGFloat) { l = l / r }
extension CGSize {
init(width: CGFloat) {
self.width = width
self.height = 0
}
init(height: CGFloat) {
self.width = 0
self.height = height
}
func with(#width: CGFloat) -> CGSize { return CGSize(width: width, height: height) }
func with(#height: CGFloat) -> CGSize { return CGSize(width: width, height: height) }
func ceil() -> CGSize { return CGSize(width: CoreGraphics.ceil(width), height: CoreGraphics.ceil(height)) }
func floor() -> CGSize { return CGSize(width: CoreGraphics.floor(width), height: CoreGraphics.floor(height)) }
func round() -> CGSize { return CGSize(width: CoreGraphics.round(width), height: CoreGraphics.round(height)) }
func point() -> CGPoint {
return CGPoint(x: width, y: height)
}
func toInts() -> (width: Int, height: Int) {
return (width: Int(width), height: Int(height))
}
}
//
// MARK: CGRect accessors
//
extension CGRect {
init(origin: CGPoint) {
self.origin = origin
self.size = CGSize()
}
init(size: CGSize) {
self.origin = CGPoint()
self.size = size
}
init(x: CGFloat, y: CGFloat) {
self.origin = CGPoint(x: x, y: y)
self.size = CGSize()
}
init(x: CGFloat, y: CGFloat, size: CGSize) {
self.origin = CGPoint(x: x, y: y)
self.size = size
}
init(width: CGFloat, height: CGFloat) {
self.origin = CGPoint()
self.size = CGSize(width: width, height: height)
}
init(origin: CGPoint, width: CGFloat, height: CGFloat) {
self.origin = origin
self.size = CGSize(width: width, height: height)
}
func with(#x: CGFloat) -> CGRect { return CGRect(x: x, y: y, width: width, height: height) }
func with(#y: CGFloat) -> CGRect { return CGRect(x: x, y: y, width: width, height: height) }
func with(#width: CGFloat) -> CGRect { return CGRect(x: x, y: y, width: width, height: height) }
func with(#height: CGFloat) -> CGRect { return CGRect(x: x, y: y, width: width, height: height) }
var x: CGFloat {
get { return origin.x }
set { origin.x = newValue }
}
var y: CGFloat {
get { return origin.y }
set { origin.y = newValue }
}
var width: CGFloat {
get { return size.width }
set { size.width = newValue }
}
var height: CGFloat {
get { return size.height }
set { size.height = newValue }
}
var centerX: CGFloat {
get { return x + width / 2 }
set { x = newValue - width / 2 }
}
var centerY: CGFloat {
get { return y + height / 2 }
set { y = newValue - height / 2 }
}
var center: CGPoint {
get { return CGPoint(x: centerX, y: centerY) }
set {
centerX = newValue.x
centerY = newValue.y
}
}
var left: CGFloat {
get { return x }
set { x = newValue }
}
var top: CGFloat {
get { return y }
set { y = newValue }
}
var right: CGFloat {
get { return x + width }
set { x = newValue - width }
}
var bottom: CGFloat {
get { return y + height }
set { y = newValue - height }
}
}
//
// MARK: CGRect helpers
//
extension CGRect {
func rectByInsetting(#size: CGSize) -> CGRect {
return rectByInsetting(dx: size.width, dy: size.height)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment