blob: 78230a0db6f9e1ff35086c7ed250a2dbe5cf2024 [file] [log] [blame]
// 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 = Strings.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;
}