mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.7 KiB
Swift
102 lines
2.7 KiB
Swift
//
|
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public class OrderedDictionary<KeyType: Hashable, ValueType> {
|
|
|
|
private var keyValueMap = [KeyType: ValueType]()
|
|
|
|
public var orderedKeys = [KeyType]()
|
|
|
|
public init() { }
|
|
|
|
// Used to clone copies of instances of this class.
|
|
public init(keyValueMap: [KeyType: ValueType],
|
|
orderedKeys: [KeyType]) {
|
|
|
|
self.keyValueMap = keyValueMap
|
|
self.orderedKeys = orderedKeys
|
|
}
|
|
|
|
// Since the contents are immutable, we only modify copies
|
|
// made with this method.
|
|
public func clone() -> OrderedDictionary<KeyType, ValueType> {
|
|
return OrderedDictionary(keyValueMap: keyValueMap, orderedKeys: orderedKeys)
|
|
}
|
|
|
|
public func value(forKey key: KeyType) -> ValueType? {
|
|
return keyValueMap[key]
|
|
}
|
|
|
|
public func append(key: KeyType, value: ValueType) {
|
|
if keyValueMap[key] != nil {
|
|
owsFailDebug("Unexpected duplicate key in key map: \(key)")
|
|
}
|
|
keyValueMap[key] = value
|
|
|
|
if orderedKeys.contains(key) {
|
|
owsFailDebug("Unexpected duplicate key in key list: \(key)")
|
|
} else {
|
|
orderedKeys.append(key)
|
|
}
|
|
|
|
if orderedKeys.count != keyValueMap.count {
|
|
owsFailDebug("Invalid contents.")
|
|
}
|
|
}
|
|
|
|
public func replace(key: KeyType, value: ValueType) {
|
|
if keyValueMap[key] == nil {
|
|
owsFailDebug("Missing key in key map: \(key)")
|
|
}
|
|
keyValueMap[key] = value
|
|
|
|
if !orderedKeys.contains(key) {
|
|
owsFailDebug("Missing key in key list: \(key)")
|
|
}
|
|
|
|
if orderedKeys.count != keyValueMap.count {
|
|
owsFailDebug("Invalid contents.")
|
|
}
|
|
}
|
|
|
|
public func remove(key: KeyType) {
|
|
if keyValueMap[key] == nil {
|
|
owsFailDebug("Missing key in key map: \(key)")
|
|
} else {
|
|
keyValueMap.removeValue(forKey: key)
|
|
}
|
|
|
|
if !orderedKeys.contains(key) {
|
|
owsFailDebug("Missing key in key list: \(key)")
|
|
} else {
|
|
orderedKeys = orderedKeys.filter { $0 != key }
|
|
}
|
|
|
|
if orderedKeys.count != keyValueMap.count {
|
|
owsFailDebug("Invalid contents.")
|
|
}
|
|
}
|
|
|
|
public var count: Int {
|
|
if orderedKeys.count != keyValueMap.count {
|
|
owsFailDebug("Invalid contents.")
|
|
}
|
|
return orderedKeys.count
|
|
}
|
|
|
|
public var orderedValues: [ValueType] {
|
|
var values = [ValueType]()
|
|
for key in orderedKeys {
|
|
guard let value = self.keyValueMap[key] else {
|
|
owsFailDebug("Missing value")
|
|
continue
|
|
}
|
|
values.append(value)
|
|
}
|
|
return values
|
|
}
|
|
}
|