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.
		
		
		
		
		
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Swift
		
	
| //
 | |
| //  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| @objc
 | |
| public class AnyLRUCache: NSObject {
 | |
| 
 | |
|     private let backingCache: LRUCache<NSObject, NSObject>
 | |
| 
 | |
|     @objc
 | |
|     public init(maxSize: Int) {
 | |
|         backingCache = LRUCache(maxSize: maxSize)
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public func get(key: NSObject) -> NSObject? {
 | |
|         return self.backingCache.get(key: key)
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public func set(key: NSObject, value: NSObject) {
 | |
|         self.backingCache.set(key: key, value: value)
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public func clear() {
 | |
|         self.backingCache.clear()
 | |
|     }
 | |
| }
 | |
| 
 | |
| // A simple LRU cache bounded by the number of entries.
 | |
| public class LRUCache<KeyType: Hashable & Equatable, ValueType> {
 | |
| 
 | |
|     private var cacheMap: [KeyType: ValueType] = [:]
 | |
|     private var cacheOrder: [KeyType] = []
 | |
|     private let maxSize: Int
 | |
| 
 | |
|     @objc
 | |
|     public init(maxSize: Int) {
 | |
|         self.maxSize = maxSize
 | |
| 
 | |
|         NotificationCenter.default.addObserver(self,
 | |
|                                                selector: #selector(didReceiveMemoryWarning),
 | |
|                                                name: UIApplication.didReceiveMemoryWarningNotification,
 | |
|                                                object: nil)
 | |
|         NotificationCenter.default.addObserver(self,
 | |
|                                                selector: #selector(didEnterBackground),
 | |
|                                                name: NSNotification.Name.OWSApplicationDidEnterBackground,
 | |
|                                                object: nil)
 | |
|     }
 | |
| 
 | |
|     deinit {
 | |
|         NotificationCenter.default.removeObserver(self)
 | |
|     }
 | |
| 
 | |
|     @objc func didEnterBackground() {
 | |
|         clear()
 | |
|     }
 | |
| 
 | |
|     @objc func didReceiveMemoryWarning() {
 | |
|         clear()
 | |
|     }
 | |
| 
 | |
|     private func updateCacheOrder(key: KeyType) {
 | |
|         cacheOrder = cacheOrder.filter { $0 != key }
 | |
|         cacheOrder.append(key)
 | |
|     }
 | |
| 
 | |
|     public func get(key: KeyType) -> ValueType? {
 | |
|         guard let value = cacheMap[key] else {
 | |
|             // Miss
 | |
|             return nil
 | |
|         }
 | |
| 
 | |
|         // Hit
 | |
|         updateCacheOrder(key: key)
 | |
| 
 | |
|         return value
 | |
|     }
 | |
| 
 | |
|     public func set(key: KeyType, value: ValueType) {
 | |
|         cacheMap[key] = value
 | |
| 
 | |
|         updateCacheOrder(key: key)
 | |
| 
 | |
|         while cacheOrder.count > maxSize {
 | |
|             guard let staleKey = cacheOrder.first else {
 | |
|                 return
 | |
|             }
 | |
|             cacheOrder.removeFirst()
 | |
|             cacheMap.removeValue(forKey: staleKey)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public func clear() {
 | |
|         cacheMap.removeAll()
 | |
|         cacheOrder.removeAll()
 | |
|     }
 | |
| }
 |