// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import UIKit
// A LRU (Least Recently Used) cache for snapshot images with a limited size.
// Once the cache reach its size limit, it will start to evict items in a
// Least Recently Used order. (where the term "used" is determined in terms
// of query to the cache).
@objcMembers public class SnapshotLRUCache: NSObject {
// The number of snapshot images stored in this cache.
private var count: Int
// The cache that stores snapshot images.
private let cache: NSCache<SnapshotIDWrapper, UIImage>
init(size: Int) {
self.count = 0
self.cache = NSCache<SnapshotIDWrapper, UIImage>()
self.cache.countLimit = size
}
func getObject(forKey: SnapshotIDWrapper) -> UIImage? {
return self.cache.object(forKey: forKey)
}
func setObject(value: UIImage, forKey: SnapshotIDWrapper) {
if self.cache.object(forKey: forKey) == nil {
self.count = min(maxCacheSize(), self.count + 1)
}
self.cache.setObject(value, forKey: forKey)
}
func removeObject(forKey: SnapshotIDWrapper) {
if self.cache.object(forKey: forKey) != nil {
self.count = max(0, self.count - 1)
}
self.cache.removeObject(forKey: forKey)
}
func removeAllObjects() {
self.count = 0
self.cache.removeAllObjects()
}
func maxCacheSize() -> Int {
return self.cache.countLimit
}
func getCount() -> Int {
return self.count
}
}