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