59 lines
		
	
	
		
			989 B
		
	
	
	
		
			Swift
		
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			989 B
		
	
	
	
		
			Swift
		
	
	
//
 | 
						|
//  Atomic.swift
 | 
						|
//
 | 
						|
// Originally found on SO:
 | 
						|
// https://stackoverflow.com/a/55064703
 | 
						|
//
 | 
						|
//  Created by Lukasz Huculak on 05/06/2020.
 | 
						|
//
 | 
						|
 | 
						|
import Foundation
 | 
						|
 | 
						|
final class Atomic<T> {
 | 
						|
 | 
						|
    private let sema = DispatchSemaphore(value: 1)
 | 
						|
    private var _value: T
 | 
						|
 | 
						|
    init (_ value: T) {
 | 
						|
        _value = value
 | 
						|
    }
 | 
						|
 | 
						|
    var value: T {
 | 
						|
        get {
 | 
						|
            sema.wait()
 | 
						|
            defer {
 | 
						|
                sema.signal()
 | 
						|
            }
 | 
						|
            return _value
 | 
						|
        }
 | 
						|
        set {
 | 
						|
            sema.wait()
 | 
						|
            _value = newValue
 | 
						|
            sema.signal()
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    func swap(_ value: T) -> T {
 | 
						|
        sema.wait()
 | 
						|
        let v = _value
 | 
						|
        _value = value
 | 
						|
        sema.signal()
 | 
						|
        return v
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
extension Atomic where T == Int {
 | 
						|
    
 | 
						|
    func increment() -> Int {
 | 
						|
        return increment(n: 1)
 | 
						|
    }
 | 
						|
 | 
						|
    func increment(n: Int) -> Int {
 | 
						|
        sema.wait()
 | 
						|
        let v = _value + n
 | 
						|
        _value = v
 | 
						|
        sema.signal()
 | 
						|
        return v
 | 
						|
    }
 | 
						|
}
 |