public Ref remove(string key) { string name = toRefName(key); Ref res = null; int idx; if (0 <= (idx = _packed.find(name))) { res = _packed.get(name); _packed = _packed.remove(idx); _sizeIsValid = false; } if (0 <= (idx = _loose.find(name))) { res = _loose.get(name); _loose = _loose.remove(idx); _sizeIsValid = false; } if (0 <= (idx = _resolved.find(name))) { res = _resolved.get(name); _resolved = _resolved.remove(idx); _sizeIsValid = false; } return(res); }
public Ref put(string keyName, Ref value) { string name = toRefName(keyName); if (!name.Equals(value.Name)) { throw new ArgumentException("keyName"); } if (!_resolved.isEmpty()) { // Collapse the resolved list into the loose list so we // can discard it and stop joining the two together. foreach (Ref @ref in _resolved) { _loose = _loose.put(@ref); } _resolved = RefList <Ref> .emptyList(); } int idx = _loose.find(name); if (0 <= idx) { Ref prior = _loose.get(name); _loose = _loose.set(idx, value); return(prior); } else { Ref prior = get(keyName); _loose = _loose.add(idx, value); _sizeIsValid = false; return(prior); } }