TM-SGNL-iOS/SignalServiceKit/MessageBackup/Archivers/SharedMap.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

44 lines
1.5 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
extension MessageBackup {
/**
* When creating and restoring from a message backup, we need to map to/from
* the backup-scoped identifers to their equivalents in our codebase.
* For example, we need to map a TSThread.uniqueId to and from the BackupProto's
* Chat.id.
*
* This class is an abstraction over a dictionary that does two things:
* 1. Allows us to swap out an in-memory implementation for an on-disk implementation,
* if in practice there are too many identifiers to keep in memory.
* 2. Ensures we use pass-by-reference instead of pass-by-value that could result
* in copies (using more memory) and requiring the `inout` keyword.
*
* MOST of the time, you should not worry about copying when passing by value;
* the compiler is smart and only actually copies on write. In this case, though, we
* really do want a single in-memory (or on-disk) map shared throughout a single
* backup pass, and we want to modify it as we go.
*/
internal class SharedMap<K: Hashable, V>: Sequence {
private var map = [K: V]()
subscript(_ key: K) -> V? {
get { map[key] }
set(value) { map[key] = value }
}
public var keys: Dictionary<K, V>.Keys {
return map.keys
}
public func makeIterator() -> Dictionary<K, V>.Iterator {
return map.makeIterator()
}
}
}