Exemple #1
0
        private bool AddNewLongEnum(ValuesByUnderlying vals, long enumValue, Enum newEnum)
        {
            // create new data structure
            var lookup = InitializeLongLookup();
            var map    = lookup.LongMap;

            var prevEnums = vals.CreatedEnums;
            int prevLen;

            if (prevEnums == null)
            {
                prevLen             = 0;
                lookup.CreatedEnums = new[] { newEnum };
            }
            else
            {
                prevLen                      = prevEnums.Length;
                lookup.CreatedEnums          = Arrays.CopyOf(prevEnums, prevLen + 1);
                lookup.CreatedEnums[prevLen] = newEnum;

                for (int i = 0; i < prevLen; ++i)
                {
                    map.Put(prevEnums[i].LongValue(), -i - 1);
                }
            }

            map.Put(enumValue, -prevLen - 1);

            // only update if no one else was faster.
            return(Interlocked.CompareExchange(ref valuesByUnderlying, lookup, vals) == vals);
        }
Exemple #2
0
        private bool AddNewLongEnum(ValuesByUnderlying vals, long enumValue, Enum newEnum)
        {
            // create new data structure
            var lookup = InitializeLongLookup();
            var map = lookup.LongMap;

            var prevEnums = vals.CreatedEnums;
            int prevLen;
            if (prevEnums == null)
            {
                prevLen = 0;
                lookup.CreatedEnums = new[] { newEnum };
            }
            else
            {
                prevLen = prevEnums.Length;
                lookup.CreatedEnums = Arrays.CopyOf(prevEnums, prevLen + 1);
                lookup.CreatedEnums[prevLen] = newEnum;

                for (int i = 0; i < prevLen; ++i)
                {
                    map.Put(prevEnums[i].LongValue(), -i - 1);
                }
            }

            map.Put(enumValue, -prevLen - 1);

            // only update if no one else was faster.
            return Interlocked.CompareExchange(ref valuesByUnderlying, lookup, vals) == vals;
        }