/**
* Helper-Class for Repeating Strings and other CharSequence-Implementations
* @author Maciej Schuttkowski
*/publicclassRepeatingCharSequenceimplementsCharSequence{finalintcount;CharSequenceinternalCharSeq="";CharSequenceseparator="";/**
* CONSTRUCTOR - RepeatingCharSequence
* @param input CharSequence to repeat
* @param count Repeat-Count
*/publicRepeatingCharSequence(CharSequenceinput,intcount){if(count<0)thrownewIllegalArgumentException("Can not repeat String \""+input+"\" less than 0 times! count="+count);if(count>0)internalCharSeq=input;this.count=count;}/**
* CONSTRUCTOR - Strings.RepeatingCharSequence
* @param input CharSequence to repeat
* @param count Repeat-Count
* @param separator Separator-Sequence to use
*/publicRepeatingCharSequence(CharSequenceinput,intcount,CharSequenceseparator){this(input,count);this.separator=separator;}@OverridepublicCharSequencesubSequence(intstart,intend){checkBounds(start);checkBounds(end);intsubLen=end-start;if(subLen<0){thrownewIndexOutOfBoundsException("Illegal subSequence-Length: "+subLen);}return(start==0&&end==length())?this:toString().substring(start,subLen);}@Overridepublicintlength(){//We return the total length of our CharSequences with the separator 1 time less than amount of repeats:returncount<1?0:((internalCharSeq.length()*count)+(separator.length()*(count-1)));}@OverridepubliccharcharAt(intindex){finalintinternalIndex=internalIndex(index);//Delegate to Separator-CharSequence or Input-CharSequence depending on internal index:if(internalIndex>internalCharSeq.length()-1){returnseparator.charAt(internalIndex-internalCharSeq.length());}returninternalCharSeq.charAt(internalIndex);}@OverridepublicStringtoString(){returncount<1?"":newStringBuilder(this).toString();}privatevoidcheckBounds(intindex){if(index<0||index>=length())thrownewIndexOutOfBoundsException("Index out of Bounds: "+index);}privateintinternalIndex(intindex){// We need to add 1 Separator-Length to total length before dividing,// as we subtracted one Separator-Length in "length()"returnindex%((length()+separator.length())/count);}}