template<typename HASHTYPE, typename ENTRY>
class maxon::LockedResourceMap< HASHTYPE, ENTRY >
LockedResourceMap simplifies the creation, calculation or load of cpu expensive resources from different threads. E.g. If the program want to load images from different threads but want to keep it only once in memory this class manages all locking and threading using ConditionVariables for ideal performance with minimum locking. A callback must be provided in the CreateOrGetEntry function to load/calculate the value when the key is created the first time.
Example:
LockedResourceMap<Url, ImageLayerRef> g_lockedResource;
Url url = ...;
ImageLayerRef image = g_lockedResource.CreateOrGetEntryCopy(url,
[](const Url& url, ImageLayerRef* createResource) -> Result<void>
{
ImageLayerRef img = ImageLayerClasses::RASTER().Create()
iferr_return;
*createResource = std::move(img);
... use 'image' for whatever ...
return OK
Definition: apibase.h:2747
#define iferr_scope
Definition: resultbase.h:1386
#define iferr_return
Definition: resultbase.h:1521
THREADSAFE.
- Template Parameters
-
HASHTYPE | Hash key type of the class. Each entry is stored under this unique hash key. |
ENTRY | Value to store under the key. |
|
| LockedResourceMap () |
|
| LockedResourceMap (LockedResourceMap &&src) |
|
| MAXON_OPERATOR_MOVE_ASSIGNMENT (LockedResourceMap) |
|
Result< ENTRY & > | CreateOrGetEntry (const HASHTYPE &hashKey, const Delegate< Result< void >(const HASHTYPE &hashKey, ENTRY *createResource)> &createdCallback) |
|
Result< ENTRY > | CreateOrGetEntryCopy (const HASHTYPE &hashKey, const Delegate< Result< void >(const HASHTYPE &hashKey, ENTRY *createResource)> &createdCallback) |
|
Spinlock & | GetLock () |
|
Bool | IsChanged () const |
|
void | SetChanged (Bool changed) |
|
| HashMap () |
|
| HashMap (const DefaultAllocator &alloc) |
|
| HashMap (HashMap &&src) |
|
| ~HashMap () |
|
| MAXON_OPERATOR_MOVE_ASSIGNMENT (HashMap) |
|
ResultMem | SetCapacityHint (Int capacity, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
ResultMem | ResizeTable (Int capacity) |
|
void | Reset () |
|
void | Flush () |
|
Int | GetCount () const |
|
Int | GetTableSize () const |
|
Int | GetMemorySize () const |
|
Int | GetNonEmptyBucketCount () const |
|
Entry * | GetNonEmptyBucket (Int i) |
|
const Entry * | GetNonEmptyBucket (Int i) const |
|
Int | GetOperationCountForSearch () const |
|
SFINAEHelper< Bool, typename MAP::IsHashMap >::type | IsEqualImpl (const MAP &other, COMPARE &&cmp, OverloadRank1) const |
|
Entry * | Find (const KEY &key) |
|
const Entry * | Find (const KEY &key) const |
|
Opt< LockedResourceHelper< ENTRY > & > | FindValue (const KEY &key) |
|
Opt< const LockedResourceHelper< ENTRY > & > | FindValue (const KEY &key) const |
|
Result< Entry * > | InsertCtorWithHash (KEY &&key, C &&constructor, HashValueType hash, Bool &created=BoolLValue()) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< Entry * > | InsertCtor (KEY &&key, C &&constructor, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | InsertEntry (const HASHTYPE &key, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | InsertEntry (HASHTYPE &&key, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | InsertEntry (KEY &&key, Bool &created=BoolLValue()) |
|
ResultRef< LockedResourceHelper< ENTRY > > | InsertKey (const HASHTYPE &key, Bool &created=BoolLValue()) |
|
ResultRef< LockedResourceHelper< ENTRY > > | InsertKey (HASHTYPE &&key, Bool &created=BoolLValue()) |
|
ResultRef< LockedResourceHelper< ENTRY > > | InsertKey (KEY &&key, Bool &created=BoolLValue()) |
|
Result< Entry * > | InsertLambda (KEY &&key, LAMBDA &&lambda, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | Insert (KEY &&key, const LockedResourceHelper< ENTRY > &value, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | Insert (KEY &&key, LockedResourceHelper< ENTRY > &&value, Bool &created=BoolLValue()) |
|
ResultRef< Entry > | InsertMultiEntry (KEY &&key) |
|
ResultMem | InsertMultiEntry (Entry *e, HashValueType hash) |
|
ResultOk< void > | Erase (const Entry *entry, Bool deleteEntry=true) |
|
ResultOk< void > | Erase (Entry *entry, Bool deleteEntry=true) |
|
ResultOk< void > | Erase (const Entry &entry, Bool deleteEntry=true) |
|
ResultOk< void > | Erase (Entry &entry, Bool deleteEntry=true) |
|
ResultOk< Bool > | Erase (const KEY &key) |
|
IteratorTemplate< SUPER > | Erase (const IteratorTemplate< SUPER > &it, Bool deleteEntry=true) |
|
void | DeleteEntry (const Entry *e) |
|
Result< void > | IntersectImpl (SET &&set, OverloadRank0) |
|
Result< void > | CopyFromImpl (HASHMAP &&other, COLLECTION_RESIZE_FLAGS resizeFlags, OverloadRank1) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFromImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, OverloadRank0) |
|
SFINAEHelper< Result< void >, typename std::remove_reference< S >::type::MapType >::type | AppendAllImpl (S &&src, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank1) |
|
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
MultiEntryIterator< false > | FindAll (const HASHTYPE &key) |
|
MultiEntryIterator< true > | FindAll (const HASHTYPE &key) const |
|
KeyIterator | GetKeys () |
|
ConstKeyIterator | GetKeys () const |
|
ValueIterator | GetValues () |
|
ConstValueIterator | GetValues () const |
|
Iterator | Begin () |
|
ConstIterator | Begin () const |
|
Iterator | End () |
|
ConstIterator | End () const |
|
Iterator | GetIterator (const Entry *e) |
|
ConstIterator | GetIterator (const Entry *e) const |
|
SFINAEHelper< String, LockedResourceHelper< ENTRY > >::type | ToString (const FormatStatement *formatStatement=nullptr) const |
|
const Entry * | FindEntryImpl (HashValueType hash, const KEY &key) const |
|
Entry * | FindEntryImpl (HashValueType hash, const KEY &key) |
|
MAXON_ATTRIBUTE_FORCE_INLINE | MapBase (ARGS &&... args) |
|
MapImpl< HashMap< HASHTYPE, LockedResourceHelper< ENTRY >, DefaultCompare, HashMapKeyValuePair, DefaultAllocator, HASHMAP_MODE::DEFAULT, 16,(HASHMAP_MODE::DEFAULT==HASHMAP_MODE::SYNCHRONIZED) ? 0 :10, DefaultAllocator > & > | ToMap () |
|
MapImpl< const HashMap< HASHTYPE, LockedResourceHelper< ENTRY >, DefaultCompare, HashMapKeyValuePair, DefaultAllocator, HASHMAP_MODE::DEFAULT, 16,(HASHMAP_MODE::DEFAULT==HASHMAP_MODE::SYNCHRONIZED) ? 0 :10, DefaultAllocator > & > | ToMap () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator MapImpl< HashMap< HASHTYPE, LockedResourceHelper< ENTRY >, DefaultCompare, HashMapKeyValuePair, DefaultAllocator, HASHMAP_MODE::DEFAULT, 16,(HASHMAP_MODE::DEFAULT==HASHMAP_MODE::SYNCHRONIZED) ? 0 :10, DefaultAllocator > & > () |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator MapImpl< const HashMap< HASHTYPE, LockedResourceHelper< ENTRY >, DefaultCompare, HashMapKeyValuePair, DefaultAllocator, HASHMAP_MODE::DEFAULT, 16,(HASHMAP_MODE::DEFAULT==HASHMAP_MODE::SYNCHRONIZED) ? 0 :10, DefaultAllocator > & > () const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE | MapBase0 (ARGS &&... args) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | Contains (typename ByValueParam< KEYTYPE >::type key) const |
|
template<typename PAIR > |
MAXON_ATTRIBUTE_FORCE_INLINE SFINAEHelper< Bool, typename PAIR::KeyType >::type | Contains (const PAIR &pair) const |
|
ResultRef< VALUETYPE > | Append (const KEYTYPE &key) |
|
template<typename PAIR > |
SFINAEHelper< ResultRef< VALUETYPE >, typename PAIR::KeyType >::type | Append (const PAIR &pair) |
|
template<typename COLLECTION2 > |
Result< void > | Add (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
Result< void > | AppendAll (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
Result< void > | AppendAllInverse (COLLECTION2 &&other) |
|
template<typename COLLECTION2 > |
Bool | ContainsAllImpl (COLLECTION2 &&other, OverloadRank0) const |
|
template<typename COLLECTION2 > |
Result< void > | SubtractImpl (COLLECTION2 &&other, OverloadRank0) |
|
template<typename COLLECTION2 , typename COMPARE > |
Bool | IsEqualImpl (const COLLECTION2 &other, COMPARE &&cmp, OverloadRank0) const |
|
HashInt | GetHashCode () const |
|
UniqueHash | GetUniqueHashCode () const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE | BaseCollection (ARGS &&... args) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator== (const COLLECTION2 &other) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator!= (const COLLECTION2 &other) const |
|
template<typename COMPARE = EqualityCompare, typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value &&!STD_IS_REPLACEMENT(same, typename std::decay< COMPARE >::type, EQUALITY), Bool >::type | IsEqual (const COLLECTION2 &other, COMPARE &&cmp=COMPARE()) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | AppendAll (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFrom (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::FIT_TO_SIZE) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Subtract (COLLECTION2 &&other) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Intersect (const COLLECTION2 &other) |
|
template<typename COLLECTION2 > |
Bool | Intersects (const COLLECTION2 &other) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFromImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, OverloadRank0) |
|
template<typename COLLECTION2 > |
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
template<typename COLLECTION2 > |
Result< void > | IntersectImpl (COLLECTION2 &&other, OverloadRank0) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | IsEmpty () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | IsPopulated () const |
|
String | ToString (const FormatStatement *formatStatement=nullptr) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Bool | ContainsAll (COLLECTION2 &&other) const |
|
template<typename COLLECTION2 > |
Bool | ContainsAllImpl (COLLECTION2 &&other, OverloadRank0) const |
|
|
using | Super = MapBase< HashMap, HASHTYPE, LockedResourceHelper< ENTRY >, EmptyClass, DefaultCompare > |
|
using | HashType = DefaultCompare |
|
using | EntryBase = HashMapEntryBase< HASHTYPE, LockedResourceHelper< ENTRY >, HashMapKeyValuePair > |
|
using | HashValueType = typename ENTRY_HANDLER::HashValueType |
|
using | IsHashMap = std::true_type |
|
using | Iterator = IteratorTemplate< EntryIteratorBase > |
|
using | ConstIterator = ConstIteratorTemplate< EntryIteratorBase > |
|
using | KeyIterator = IteratorTemplate< KeyIteratorBase > |
|
using | ConstKeyIterator = ConstIteratorTemplate< KeyIteratorBase > |
|
using | ValueIterator = IteratorTemplate< ValueIteratorBase > |
|
using | ConstValueIterator = ConstIteratorTemplate< ValueIteratorBase > |
|
using | MapType = COLLECTION |
|
using | Super = BaseCollection< COLLECTION, SUPER > |
|
using | KeyType = KEYTYPE |
|
using | ValueType = VALUETYPE |
|
using | IsCollection = std::true_type |
|
using | IsBaseArray = std::false_type |
|
static const Entry * | GetEntry (const LockedResourceHelper< ENTRY > *value) |
|
static Entry * | GetEntry (typename std::remove_const< LockedResourceHelper< ENTRY > >::type *value) |
|
static const KEYTYPE & | GetMapKey (const KEYTYPE &key) |
|
template<typename PAIR > |
static const KEYTYPE & | GetMapKey (const PAIR &pair) |
|
static const COLLECTION_KIND | KIND |
|
using | Bucket = typename std::conditional< HASHMAP_MODE::DEFAULT==HASHMAP_MODE::DEFAULT, DefaultBucket, SimpleBucket >::type |
|
Bool | ResizeTableImpl (Int length) |
|
Entry * | AddEntryImpl (Entry *e, Entry *prev, Bool &created, Bool multi, void *) |
|
Entry * | AddEntryImpl (Entry *e, Entry *prev, Bool &created, Bool multi, Char *) |
|
void | ResetImpl (Bool destructor) |
|
void | FlushEntriesImpl () |
|
const Char * | GetSignature (void *) const |
|
const Char * | GetSignature (Char *) const |
|
static Entry * | LoadRelaxed (AtomicPtr< Entry > &e) |
|
static Entry * | LoadRelaxed (Entry *e) |
|
static Entry * | LoadAcquire (AtomicPtr< Entry > &e) |
|
static Entry * | LoadAcquire (Entry *e) |
|
static void | StoreRelaxed (AtomicPtr< Entry > &e, Entry *newValue) |
|
static void | StoreRelaxed (Entry *&e, Entry *newValue) |
|
static Bool | TryCompareAndSwap (AtomicPtr< Entry > &e, Entry *newValue, Entry *compare) |
|
static Bool | TryCompareAndSwap (Entry *&e, Entry *newValue, Entry *compare) |
|
HashMapAllocator< DefaultAllocator, DefaultAllocator > | _allocator |
|
Bucket * | _table |
|
Int | _tableLengthM1 |
|
Bucket ** | _nonemptyBuckets |
|
Int | _nonemptyBucketCount |
|
Int | _size |
|
Int | _resizeThreshold |
|