Atomic.swift 845 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. //
  2. // Atomic.swift
  3. // Broadcast Extension
  4. //
  5. // Created by Maksym Shcheglov.
  6. // https://www.onswiftwings.com/posts/atomic-property-wrapper/
  7. //
  8. // From https://github.com/jitsi/jitsi-meet-sdk-samples (Apache 2.0 license)
  9. //
  10. // SPDX-FileCopyrightText: Maksym Shcheglov
  11. // SPDX-License-Identifier: Apache-2.0
  12. //
  13. import Foundation
  14. @propertyWrapper
  15. struct Atomic<Value> {
  16. private var value: Value
  17. private let lock = NSLock()
  18. init(wrappedValue value: Value) {
  19. self.value = value
  20. }
  21. var wrappedValue: Value {
  22. get { load() }
  23. set { store(newValue: newValue) }
  24. }
  25. func load() -> Value {
  26. lock.lock()
  27. defer { lock.unlock() }
  28. return value
  29. }
  30. mutating func store(newValue: Value) {
  31. lock.lock()
  32. defer { lock.unlock() }
  33. value = newValue
  34. }
  35. }