public bool TryGetNextValue(out TValue item, ref NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckReadAndThrow(m_Safety); #endif return(NativeHashMapBase <TKey, TValue> .TryGetNextValueAtomic(m_Buffer, out item, ref it)); }
public bool SetValue(TValue item, NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckWriteAndThrow(m_Safety); #endif return(NativeHashMapBase <TKey, TValue> .SetValue(m_Buffer, ref it, ref item)); }
public static unsafe bool TryGetNextValueAtomic(NativeHashMapData *data, out TValue item, ref NativeMultiHashMapIterator <TKey> it) { int entryIdx = it.NextEntryIndex; it.NextEntryIndex = -1; it.EntryIndex = -1; item = default(TValue); if (entryIdx < 0 || entryIdx >= data->capacity) { return(false); } int *nextPtrs = (int *)data->next; while (!UnsafeUtility.ReadArrayElement <TKey>(data->keys, entryIdx).Equals(it.key)) { entryIdx = nextPtrs[entryIdx]; if (entryIdx < 0 || entryIdx >= data->capacity) { return(false); } } it.NextEntryIndex = nextPtrs[entryIdx]; it.EntryIndex = entryIdx; // Read the value item = UnsafeUtility.ReadArrayElement <TValue>(data->values, entryIdx); return(true); }
public void Remove(NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckWriteAndThrow(m_Safety); #endif NativeHashMapBase <TKey, TValue> .Remove(m_Buffer, it); }
public static unsafe void Remove(NativeHashMapData *data, NativeMultiHashMapIterator <TKey> it) { // First find the slot based on the hash int *buckets = (int *)data->buckets; int *nextPtrs = (int *)data->next; int bucket = it.key.GetHashCode() & data->bucketCapacityMask; int entryIdx = buckets[bucket]; if (entryIdx == it.EntryIndex) { buckets[bucket] = nextPtrs[entryIdx]; } else { while (entryIdx >= 0 && nextPtrs[entryIdx] != it.EntryIndex) { entryIdx = nextPtrs[entryIdx]; } if (entryIdx < 0) { throw new InvalidOperationException("Invalid iterator passed to HashMap remove"); } nextPtrs[entryIdx] = nextPtrs[it.EntryIndex]; } // And free the index nextPtrs[it.EntryIndex] = data->firstFreeTLS[0]; data->firstFreeTLS[0] = it.EntryIndex; }
/// <summary> /// /// </summary> /// <param name="item"></param> /// <param name="it"></param> /// <returns></returns> public bool SetValue(TValue item, NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckWriteAndThrow(m_Safety); #endif return(m_MultiHashMapData.SetValue(item, it)); }
/// <summary> /// /// </summary> /// <param name="key"></param> /// <param name="item"></param> /// <param name="it"></param> /// <returns></returns> public bool TryGetFirstValue(TKey key, out TValue item, out NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckReadAndThrow(m_Safety); #endif return(m_MultiHashMapData.TryGetFirstValue(key, out item, out it)); }
/// <summary> /// /// </summary> /// <param name="it"></param> public void Remove(NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckWriteAndThrow(m_Safety); #endif m_MultiHashMapData.Remove(it); }
unsafe public bool TryGetFirstValue(TKey key, out TValue item, out NativeMultiHashMapIterator <TKey> it) { #if ENABLE_UNITY_COLLECTIONS_CHECKS AtomicSafetyHandle.CheckReadAndThrow(m_Safety); #endif return(NativeHashMapBase <TKey, TValue> .TryGetFirstValueAtomic((NativeHashMapData *)m_Buffer, key, out item, out it)); }
public static unsafe bool SetValue(NativeHashMapData *data, ref NativeMultiHashMapIterator <TKey> it, ref TValue item) { int entryIdx = it.EntryIndex; if (entryIdx < 0 || entryIdx >= data->capacity) { return(false); } UnsafeUtility.WriteArrayElement(data->values, entryIdx, item); return(true); }
public static unsafe bool TryGetFirstValueAtomic(NativeHashMapData *data, TKey key, out TValue item, out NativeMultiHashMapIterator <TKey> it) { it.key = key; if (data->allocatedIndexLength <= 0) { it.EntryIndex = it.NextEntryIndex = -1; item = default(TValue); return(false); } // First find the slot based on the hash int *buckets = (int *)data->buckets; int bucket = key.GetHashCode() & data->bucketCapacityMask; it.EntryIndex = it.NextEntryIndex = buckets[bucket]; return(TryGetNextValueAtomic(data, out item, ref it)); }
/// <summary> /// Replace value at iterator. /// </summary> /// <param name="item">Value.</param> /// <param name="it">Iterator</param> /// <returns>Returns true if value was sucessfuly replaced.</returns> public bool SetValue(TValue item, NativeMultiHashMapIterator <TKey> it) { CheckWrite(); return(m_MultiHashMapData.SetValue(item, it)); }
/// <summary> /// Retrieve iterator to the next value for the key. /// </summary> /// <param name="item">Output value.</param> /// <param name="it">Iterator.</param> /// <returns>Returns true if next value for the key is found.</returns> public bool TryGetNextValue(out TValue item, ref NativeMultiHashMapIterator <TKey> it) { CheckRead(); return(m_MultiHashMapData.TryGetNextValue(out item, ref it)); }
/// <summary> /// Retrieve iterator for the first value for the key. /// </summary> /// <param name="key">The key.</param> /// <param name="item">Output value.</param> /// <param name="it">Iterator.</param> /// <returns>Returns true if the container contains the key.</returns> public bool TryGetFirstValue(TKey key, out TValue item, out NativeMultiHashMapIterator <TKey> it) { CheckRead(); return(m_MultiHashMapData.TryGetFirstValue(key, out item, out it)); }
/// <summary> /// Removes all elements with the specified iterator the container. /// </summary> /// <param name="it">Iterator pointing at value to remove.</param> public void Remove(NativeMultiHashMapIterator <TKey> it) { CheckWrite(); m_MultiHashMapData.Remove(it); }