Skip to content

Instantly share code, notes, and snippets.

@V8tr
Forked from nestserau/AtomicInteger.swift
Created May 15, 2018 10:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save V8tr/37050840e6f1fcf028769706626cdd2d to your computer and use it in GitHub Desktop.
Save V8tr/37050840e6f1fcf028769706626cdd2d to your computer and use it in GitHub Desktop.
Atomic way to operate on integers in Swift. Inspired by Java's AtomicInteger
/// This is free and unencumbered software released into the public domain.
///
/// Anyone is free to copy, modify, publish, use, compile, sell, or
/// distribute this software, either in source code form or as a compiled
/// binary, for any purpose, commercial or non-commercial, and by any
/// means.
///
/// In jurisdictions that recognize copyright laws, the author or authors
/// of this software dedicate any and all copyright interest in the
/// software to the public domain. We make this dedication for the benefit
/// of the public at large and to the detriment of our heirs and
/// successors. We intend this dedication to be an overt act of
/// relinquishment in perpetuity of all present and future rights to this
/// software under copyright law.
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
/// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
/// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
/// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
/// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
/// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
/// OTHER DEALINGS IN THE SOFTWARE.
///
/// For more information, please refer to <http://unlicense.org/>
import Foundation
public final class AtomicInteger {
private let lock = DispatchSemaphore(value: 1)
private var _value: Int
public init(value initialValue: Int = 0) {
_value = initialValue
}
public var value: Int {
get {
lock.wait()
defer { lock.signal() }
return _value
}
set {
lock.wait()
defer { lock.signal() }
_value = newValue
}
}
public func decrementAndGet() -> Int {
lock.wait()
defer { lock.signal() }
_value -= 1
return _value
}
public func incrementAndGet() -> Int {
lock.wait()
defer { lock.signal() }
_value += 1
return _value
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment