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); }
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; }