| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| patch class Expando<T> { |
| /* patch */ Expando([this.name]) : _data = new List(); |
| |
| /* patch */ T operator[](Object object) { |
| _checkType(object); |
| var doCompact = false; |
| var result = null; |
| for (int i = 0; i < _data.length; ++i) { |
| var key = _data[i].key; |
| if (key === object) { |
| result = _data[i].value; |
| break; |
| } |
| if (key === null) { |
| doCompact = true; |
| _data[i] = null; |
| } |
| } |
| if (doCompact) { |
| _data = _data.filter((e) => (e !== null)); |
| } |
| return result; |
| } |
| |
| /* patch */ void operator[]=(Object object, T value) { |
| _checkType(object); |
| var doCompact = false; |
| int i = 0; |
| for (; i < _data.length; ++i) { |
| var key = _data[i].key; |
| if (key === object) { |
| break; |
| } |
| if (key === null) { |
| doCompact = true; |
| _data[i] = null; |
| } |
| } |
| if (i !== _data.length && value === null) { |
| doCompact = true; |
| _data[i] = null; |
| } else if (i !== _data.length) { |
| _data[i].value = value; |
| } else { |
| _data.add(new _WeakProperty(object, value)); |
| } |
| if (doCompact) { |
| _data = _data.filter((e) => (e !== null)); |
| } |
| } |
| |
| static _checkType(object) { |
| if (object === null) { |
| throw new NullPointerException(); |
| } |
| if (object is bool || object is num || object is String) { |
| throw new ArgumentError(object); |
| } |
| } |
| |
| List _data; |
| } |