blob: 0e9c1a8cdb227f8dc05e9d5b4002e9105df6c07a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _DECAF_LANG_STRINGBUILDER_H_
#define _DECAF_LANG_STRINGBUILDER_H_
#include <decaf/util/Config.h>
#include <decaf/lang/AbstractStringBuilder.h>
#include <decaf/lang/String.h>
#include <decaf/lang/CharSequence.h>
#include <decaf/lang/Appendable.h>
#include <decaf/lang/Pointer.h>
namespace decaf {
namespace lang {
class StringBuffer;
/**
* A modifiable sequence of characters for use in creating and modifying Strings.
* This class is intended as a direct replacement of StringBuffer for non-concurrent
* use; unlike StringBuffer this class is not synchronized for thread safety.
*
* The majority of the modification methods on this class return a reference to this
* StringBuilder, so that, like StringBuffers, they can be used in chaining method
* calls together. For example:
*
* StringBuilder("One should ").append("always strive ").append("to achieve Harmony")}.
*
* @see CharSequence
* @see Appendable
* @see StringBuffer
* @see String
*
* @since 1.0
*/
class DECAF_API StringBuilder : public AbstractStringBuilder,
public Appendable {
public:
/**
* Creates an empty StringBuilder instance with a capacity of 16.
*/
StringBuilder();
/**
* Creates an empty StringBuilder instance with the given capacity.
*
* @param capacity
* The initial capacity to give this new instance.
*
* @throws NegativeArraySizeException if the given capacity is less than zero.
*/
StringBuilder(int capacity);
/**
* Constructs a string builder initialized to the contents of the specified string.
* The initial capacity of the string builder is 16 plus the length of the string
* argument.
*
* @param source
* The String whose contents are to be copied into this StringBuilder.
*/
StringBuilder(const String& source);
/**
* Constructs a string builder initialized to the contents of the specified string.
* The initial capacity of the string builder is 16 plus the length of the string
* argument.
*
* @param source
* The CharSequence whose contents are to be copied into this StringBuilder.
*
* @throws NullPointerException if the CharSequence pointer is NULL.
*/
StringBuilder(const CharSequence* source);
virtual ~StringBuilder();
public:
virtual int length() const;
/**
* Appends the string representation of the given object pointer. If the pointer
* is NULL then the value "null" is appended to this StringBuilder.
*
* @param pointer
* A pointer to some object that must define a toString method.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
template<typename POINTER>
StringBuilder& append(const POINTER* pointer) {
if (pointer == NULL) {
doAppendNull();
} else {
doAppend(pointer->toString());
}
return *this;
}
/**
* Appends the string representation of the given object pointer. If the pointer
* is NULL then the value "null" is appended to this StringBuilder.
*
* @param pointer
* A pointer to some object that must define a toString method.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
template<typename TYPE>
StringBuilder& append(const Pointer<TYPE> pointer) {
if (pointer == NULL) {
doAppendNull();
} else {
doAppend(pointer->toString());
}
return *this;
}
/**
* Appends the string representation of the given boolean value.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(bool value);
/**
* Appends the given char value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(char value);
/**
* Appends the given short value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(short value);
/**
* Appends the given int value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(int value);
/**
* Appends the given long long value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(long long value);
/**
* Appends the given float value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(float value);
/**
* Appends the given double value into the internal char buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(double value);
/**
* Appends the contents of the given C string into this buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(const char* value);
/**
* Appends the given subsequence of the given C string into this buffer.
*
* @param value
* The C string value to be appended into this buffer.
* @param offset
* The starting position into the C string array.
* @param length
* The number of characters to copy from the given array.
*
* @throws NullPointerException if the pointer is NULL.
* @throws IndexOutOfBoundsException if offset or length is negative or the value of
* offset + length is greater than the strings length.
*/
StringBuilder& append(const char* value, int offset, int length);
/**
* Appends the contents of the CharSequence into this buffer, if the CharSequence
* pointer is NULL then this method appends the string "null" to this Buffer.
*
* @param value
* The CharSequence value to be appended into this buffer.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(const CharSequence* value);
/**
* Appends the given CharSequence to this buffer starting at the given offset and
* ending after the length number of characters has been append. If the given
* CharSequence pointer is NULL then this method appends the string "null".
*
* @param value
* The CharSequence value to be appended into this buffer.
* @param offset
* The starting position into the CharSequence.
* @param length
* The number of characters to copy from the given CharSequence.
*
* @throws IndexOutOfBoundsException if offset or length is negative or the value of
* offset + length is greater than the strings length.
*/
StringBuilder& append(const CharSequence* value, int offset, int length);
/**
* Appends the contents of the String into this buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(const String& value);
/**
* Appends the contents of the StringBuffer into this buffer.
*
* @param value
* The value to append to the contents of the StringBuilder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& append(const StringBuffer& value);
/**
* Removes the characters in a substring of this buffer. The substring begins at
* the specified start and extends to the character at index end - 1 or to the
* end of the sequence if end is greater than the current length() value. If
* start is equal to end, no changes are made.
*
* @param start
* The starting index to delete from this buffer.
* @param end
* The ending index (exclusive) to delete from this buffer.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws StringIndexOutOfBoundsException
* if start is negative, greater than length(), or greater than end.
*/
StringBuilder& deleteRange(int start, int end);
/**
* Deletes the char at the specified position in this buffer, length decreases by one.
*
* @param index
* The index in this buffer where the character to delete is located.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws StringIndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& deleteCharAt(int index);
/**
* Inserts the string representation of the given object pointer. If the pointer
* is NULL then the value "null" is inserted to this StringBuilder.
*
* @param index
* The position in the buffer to insert the char value.
* @param pointer
* A pointer to some object that must define a toString method.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
template<typename POINTER>
StringBuilder& insert(int index, const POINTER* pointer) {
if (pointer == NULL) {
doInsert(index, "null");
} else {
doInsert(index, pointer->toString());
}
return *this;
}
/**
* Inserts the string representation of the given object pointer. If the pointer
* is NULL then the value "null" is inserted to this StringBuilder.
*
* @param index
* The position in the buffer to insert the char value.
* @param pointer
* A pointer to some object that must define a toString method.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
template<typename TYPE>
StringBuilder& insert(int index, const Pointer<TYPE> pointer) {
if (pointer == NULL) {
doInsert(index, "null");
} else {
doInsert(index, pointer->toString());
}
return *this;
}
/**
* Inserts the given char into the character buffer at the given index. The contents
* of the buffer are shifted up by one from the given index prior to insertion.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, char value);
/**
* Inserts the given boolean into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(bool).
*
* @param index
* The position in the buffer to insert the boolean value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, bool value);
/**
* Inserts the given short into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(short).
*
* @param index
* The position in the buffer to insert the short value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, short value);
/**
* Inserts the given int into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(int).
*
* @param index
* The position in the buffer to insert the int value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, int value);
/**
* Inserts the given long long into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(long long).
*
* @param index
* The position in the buffer to insert the long long value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, long long value);
/**
* Inserts the given float into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(float).
*
* @param index
* The position in the buffer to insert the float value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, float value);
/**
* Inserts the given double into the character buffer at the given index. The value
* is converted to a String in the same fashion as calling String::valueOf(double).
*
* @param index
* The position in the buffer to insert the double value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, double value);
/**
* Inserts the given C string into the character buffer at the given index.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws NullPointerException if the target C string pointer is NULL.
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, const char* value);
/**
* Inserts the given String into the character buffer at the given index.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws NullPointerException if the target C string pointer is NULL.
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, const String& value);
/**
* Inserts the given std::string into the character buffer at the given index.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws NullPointerException if the target std::string pointer is NULL.
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, const std::string& value);
/**
* Inserts the given C string into the character buffer at the given index starting
* from the given offset into the string and copying up to length chars from the string
* into this buffer.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
* @param offset
* The offset into the C string to start the copy from.
* @param length
* The number of characters to copy from the given C string.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws NullPointerException if the target C string pointer is NULL.
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
* If offset or length is negative or offset > the string length + length.
*/
StringBuilder& insert(int index, const char* value, int offset, int length);
/**
* Inserts the given CharSequence into the character buffer at the given index starting
* from the given offset into the string and copying up to length chars from the string
* into this buffer. If the CharSequence pointer is NULL then this method inserts the
* string "null" into this Buffer.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
*/
StringBuilder& insert(int index, const CharSequence* value);
/**
* Inserts the given CharSequence into the character buffer at the given index starting
* from the given offset into the string and copying up to length chars from the string
* into this buffer. If the CharSequence pointer is NULL then this method inserts the
* string "null" into this Buffer.
*
* @param index
* The position in the buffer to insert the char value.
* @param value
* The value to insert at the given index.
* @param offset
* The offset into the CharSequence to start the copy from.
* @param length
* The number of characters to copy from the given CharSequence.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException
* if the index is negative or greater than or equal to length().
* If offset or length is negative or offset > the string length + length.
*/
StringBuilder& insert(int index, const CharSequence* value, int offset, int length);
/**
* Replace some number of characters in this Buffer with the value given.
*
* The characters replaced start at the given index and end at the given end value
* (exclusive). If the replacement string value is longer the internal buffer is
* lengthened to accommodate the new value.
*
* @param start
* The starting index to replace in the buffer (inclusive).
* @param end
* The ending index of the replacement operation (exclusive).
* @param value
* The new string value to replace the older value.
*
* @return a reference to this StringBuilder so that operations can be chained.
*
* @throws IndexOutOfBoundsException if start is negative, greater than end or greater than length().
*/
StringBuilder& replace(int start, int end, const String& value);
/**
* Reverses the order of characters in this builder.
*
* @return a reference to this StringBuilder so that operations can be chained.
*/
StringBuilder& reverse();
};
}}
#endif /* _DECAF_LANG_STRINGBUILDER_H_ */