// 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.
 */
class StringBuffer implements OutputStream {
  /**
   * Creates the string buffer with an initial content.
   */
  StringBuffer([String content = ""]) {
    clear();
    append(content);
  }

  /// From OutputStream. Appends [str] to the buffer.
  void writeString(String str) {
    append(str);
  }

  /// From OutputStream. Appends the [charCode] to the buffer.
  void writeCharCode(int charCode) {
    throw "StringBuffer.writeCharCode Unimplemented";
  }

  void writeByte(int value) {
    throw "StringBuffer.writeByte unimplemented";
  }

  void writeByteArray(Array<int> buffer, int offset, int length) {
    throw "StringBuffer.writeByteArray unimplemented";
  }

  void close() {}
  void flush() {}


  /**
   * Returns the length of the buffer.
   */
  int get length() {
    return length_;
  }

  /**
   * Appends [str] to the buffer.
   */
  void append(String str) {
    if (str === null || str.isEmpty()) return;
    buffer_.add(str);
    length_ += str.length;
  }

  /**
   * Appends all items in [strings] to the buffer.
   */
  void appendAll(Collection<String> strings) {
    strings.forEach((str) { append(str); });
  }

  /**
   * Clears the string buffer.
   */
  void clear() {
    buffer_ = new GrowableArray<String>(4);
    length_ = 0;
  }

  /**
   * 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 = StringBase.concatAll(_buffer);
    buffer_.clear();
    buffer_.add(result);
    // Since we track the length at each append operation, there is no
    // need to update it in this function.
    return result;
  }

  GrowableArray<String> buffer_;
  int length_;
}
