| // Copyright (c) 2011, 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. |
| |
| /** |
| * The StringBuffer class is useful for concatenating strings |
| * efficiently. Only on a call to [toString] are the strings |
| * concatenated to a single String. |
| */ |
| abstract class StringBuffer { |
| /** |
| * Creates the string buffer with an initial content. |
| */ |
| factory StringBuffer([Object content = ""]) |
| => new _StringBufferImpl(content); |
| |
| /** |
| * Returns the length of the buffer. |
| */ |
| int get length; |
| |
| /** |
| * Returns whether the buffer is empty. |
| */ |
| bool get isEmpty; |
| |
| /** |
| * Converts [obj] to a string and adds it to the buffer. Returns [:this:]. |
| */ |
| StringBuffer add(Object obj); |
| |
| /** |
| * Adds the string representation of [charCode] to the buffer. |
| * Returns [this]. |
| */ |
| StringBuffer addCharCode(int charCode); |
| |
| /** |
| * Adds all items in [objects] to the buffer. Returns [:this:]. |
| */ |
| StringBuffer addAll(Collection objects); |
| |
| /** |
| * Clears the string buffer. Returns [:this:]. |
| */ |
| StringBuffer clear(); |
| |
| /** |
| * Returns the contents of buffer as a concatenated string. |
| */ |
| String toString(); |
| } |
| |
| class _StringBufferImpl implements StringBuffer { |
| /** |
| * Creates the string buffer with an initial content. |
| */ |
| _StringBufferImpl(Object content) { |
| clear(); |
| add(content); |
| } |
| |
| /** |
| * Returns the length of the buffer. |
| */ |
| int get length { |
| return _length; |
| } |
| |
| bool get isEmpty { |
| return _length === 0; |
| } |
| |
| /** |
| * Adds [obj] to the buffer. Returns [this]. |
| */ |
| StringBuffer add(Object obj) { |
| String str = obj.toString(); |
| if (str === null || str.isEmpty) { |
| return this; |
| } |
| _buffer.add(str); |
| _length += str.length; |
| return this; |
| } |
| |
| /** |
| * Adds all items in [objects] to the buffer. Returns [this]. |
| */ |
| StringBuffer addAll(Collection objects) { |
| for (Object obj in objects) { |
| add(obj); |
| } |
| return this; |
| } |
| |
| /** |
| * Adds the string representation of [charCode] to the buffer. |
| * Returns [this]. |
| */ |
| StringBuffer addCharCode(int charCode) { |
| return add(new String.fromCharCodes([charCode])); |
| } |
| |
| /** |
| * Clears the string buffer. Returns [this]. |
| */ |
| StringBuffer clear() { |
| _buffer = new List<String>(); |
| _length = 0; |
| return this; |
| } |
| |
| /** |
| * Returns the contents of buffer as a concatenated string. |
| */ |
| String toString() { |
| if (_buffer.length === 0) return ""; |
| if (_buffer.length === 1) return _buffer[0]; |
| String result = StringImplementation.concatAll(_buffer); |
| _buffer.clear(); |
| _buffer.add(result); |
| // Since we track the length at each add operation, there is no |
| // need to update it in this function. |
| return result; |
| } |
| |
| List<String> _buffer; |
| int _length; |
| } |