/* ************************************************************************ # # DivConq # # http://divconq.com/ # # Copyright: # Copyright 2014 eTimeline, LLC. All rights reserved. # # License: # See the license.txt file in the project's top-level directory for details. # # Authors: # * Andy White # ************************************************************************ */ package divconq.lang; // TODO convert to use Memory public class StringBuilder32 implements CharSequence { protected StringBuilder sb = new StringBuilder(); @Override public int length() { return this.sb.length(); } @Override public String toString() { return this.sb.toString(); } public void reset() { this.sb = new StringBuilder(); } public void append(CharSequence str) { if (str != null) this.sb.append(str); } public void appendLine(CharSequence str) { if (str != null) this.sb.append(str); this.sb.append('\n'); } public void appendLine() { this.sb.append('\n'); } public void append(char c) { this.sb.append(c); } // appends a utf32 character or surrogate pair public void append(int value) throws Exception { if (value < 0 || value > 0x10FFFF) throw new Exception("UTF builder error: The argument must be from 0 to 0x10FFFF."); if (0xD800 <= value && value <= 0xDFFF) throw new Exception("UTF builder error: The argument must not be in surrogate pair range."); if (value < 0x10000) { this.sb.append((char)value); } else { value -= 0x10000; // we have a surrogate pair this.sb.append((char)((value >> 10) + 0xD800)); this.sb.append((char)(value % 0x0400 + 0xDC00)); } } @Override public char charAt(int index) { return this.sb.charAt(index); } @Override public CharSequence subSequence(int start, int end) { return this.sb.subSequence(start, end); } }