// // ASWeakMap.h // AsyncDisplayKit // // Created by Chris Danford on 7/11/16. // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. // #import NS_ASSUME_NONNULL_BEGIN /** * This class is used in conjunction with ASWeakMap. Instances of this type are returned by an ASWeakMap, * must retain this value for as long as they want the entry to exist in the map. */ @interface ASWeakMapEntry : NSObject @property (nonatomic, retain, readonly) Value value; @end /** * This is not a full-featured map. It does not support features like `count` and FastEnumeration because there * is not currently a need. * * This is a map that does not retain keys or values added to it. When both getting and setting, the caller is * returned a ASWeakMapEntry and must retain it for as long as it wishes the key/value to remain in the map. * We return a single Entry value to the caller to avoid two potential problems: * * 1) It's easier for callers to retain one value (the Entry) and not two (a key and a value). * 2) Key values are tested for `isEqual` equality. If if a caller asks for a key "A" that is equal to a key "B" * already in the map, then we need the caller to retain key "B" and not key "A". Returning an Entry simplifies * the semantics. * * The underlying storage is a hash table and the Key type should implement `hash` and `isEqual:`. */ @interface ASWeakMap<__covariant Key : NSObject *, Value> : NSObject /** * Read from the cache. The Value object is accessible from the returned ASWeakMapEntry. */ - (nullable ASWeakMapEntry *)entryForKey:(Key)key; /** * Put a value into the cache. If an entry with an equal key already exists, then the value is updated on the existing entry. */ - (ASWeakMapEntry *)setObject:(Value)value forKey:(Key)key; @end NS_ASSUME_NONNULL_END