Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        public void Remove(NativeMultiHashMapIterator <TKey> it)
        {
#if ENABLE_UNITY_COLLECTIONS_CHECKS
            AtomicSafetyHandle.CheckWriteAndThrow(m_Safety);
#endif
            NativeHashMapBase <TKey, TValue> .Remove(m_Buffer, it);
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        /// <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));
        }
Ejemplo n.º 7
0
        /// <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));
        }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
 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);
        }
Ejemplo n.º 11
0
        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));
        }
Ejemplo n.º 12
0
 /// <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));
 }
Ejemplo n.º 13
0
 /// <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));
 }
Ejemplo n.º 14
0
 /// <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));
 }
Ejemplo n.º 15
0
 /// <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);
 }