/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.ejb.plugins.cmp.ejbql;
import java.util.Iterator;
import java.util.LinkedList;
/**
* A buffer simmilar to StringBuffer that works on string blocks instead
* of individual characters. This eliminates excessive array allocation
* and copying at the expense of removal and substring opperations. This
* is a greate compromise as usually the only functions called on a
* StringBuffer are append, length, and toString.
*
* @author <a href="mailto:dain@daingroup.com">Dain Sundstrom</a>
* @version $Revision: 81030 $
*/
public final class BlockStringBuffer {
private LinkedList list = new LinkedList();
private int length;
public BlockStringBuffer() {
}
public BlockStringBuffer append(boolean b) {
String string = String.valueOf(b);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(char c) {
String string = String.valueOf(c);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(char[] str) {
String string = String.valueOf(str);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(char[] str, int offset, int len) {
String string = String.valueOf(str, offset, len);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(double d) {
String string = String.valueOf(d);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(float f) {
String string = String.valueOf(f);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(int i) {
String string = String.valueOf(i);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(long l) {
String string = String.valueOf(l);
length += string.length();
list.addLast(string);
return this;
}
public BlockStringBuffer append(Object obj) {
if(obj instanceof String) {
String string = (String)obj;
length += string.length();
list.addLast(string);
} else if(obj instanceof BlockStringBuffer) {
BlockStringBuffer buf = (BlockStringBuffer)obj;
length += buf.length;
list.addAll(buf.list);
} else {
String string = String.valueOf(obj);
length += string.length();
list.addLast(string);
}
return this;
}
public BlockStringBuffer prepend(boolean b) {
String string = String.valueOf(b);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(char c) {
String string = String.valueOf(c);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(char[] str) {
String string = String.valueOf(str);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(char[] str, int offset, int len) {
String string = String.valueOf(str, offset, len);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(double d) {
String string = String.valueOf(d);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(float f) {
String string = String.valueOf(f);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(int i) {
String string = String.valueOf(i);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(long l) {
String string = String.valueOf(l);
length += string.length();
list.addFirst(string);
return this;
}
public BlockStringBuffer prepend(Object obj) {
if(obj instanceof String) {
String string = (String)obj;
length += string.length();
list.addFirst(string);
} else if(obj instanceof BlockStringBuffer) {
BlockStringBuffer buf = (BlockStringBuffer)obj;
length += buf.length;
list.addAll(0, buf.list);
} else {
String string = String.valueOf(obj);
length += string.length();
list.addFirst(string);
}
return this;
}
public int length() {
return length;
}
public int size() {
return length;
}
public StringBuffer toStringBuffer() {
// use a string buffer because it will share the final buffer
// with the string object which avoids an allocate and copy
StringBuffer buf = new StringBuffer(length);
for(int i = 0; i < list.size(); i++)
{
buf.append( (String)list.get(i));
}
return buf;
}
public String toString() {
return toStringBuffer().toString();
}
}