public static void write(ICharsetCodec cc, CharBuffer cb, IUnitChain unitChain) { final CharsetEncoder encoder = cc.getEncoder(); try { IUnit unit = Util.lastUnit(unitChain); ByteBuffer bb = unit.getByteBufferForWrite(); boolean flush = false; encoder.reset(); for (; ; ) { CoderResult cr = flush ? encoder.flush(bb) : encoder.encode(cb, bb, true); unit.size(bb.position() - unit.start()); if (cr.isOverflow()) { unit = Util.appendNewUnit(unitChain); bb = unit.getByteBufferForWrite(); continue; } if (!cr.isUnderflow()) cr.throwException(); if (flush) break; else flush = true; } } catch (CharacterCodingException e) { throw new RuntimeException(e); } finally { cc.releaseEncoder(encoder); } }
@Override public void prepend(char[] chars, int offset, int length, IUnitChain unitChain) { final ICharsetCodec cc = CharsetCodec.get(m_charsetName); try (BytesBuilder bb = BytesBuilder.get()) { cc.encode(chars, offset, length, bb); length = bb.length(); IUnit unit = Util.firstUnit(unitChain); while ((length -= Helper.prepend(bb, 0, length, unit)) > 0) unit = Util.prependNewUnit(unitChain); } }
@Override public char[] get(IUnitChain unitChain, int index) { final ByteBufferArray bba = ByteBufferArray.get(); try { IUnit unit = unitChain.currentUnit(); bba.add(unit.getByteBufferForRead(index, unit.size() - index)); while ((unit = unitChain.nextUnit()) != null) bba.add(unit.getByteBufferForRead(0, unit.size())); final ICharsetCodec cc = CharsetCodec.get(m_charsetName); return cc.decode(bba.array(), 0, bba.size()); } finally { bba.clear(); } }
public static void prepend(ICharsetCodec cc, StringBuilder sb, IUnitChain unitChain) { try (BytesBuilder bb = BytesBuilder.get()) { cc.encode(sb, bb); int length = bb.length(); IUnit unit = Util.firstUnit(unitChain); while ((length -= prepend(bb, 0, length, unit)) > 0) unit = Util.prependNewUnit(unitChain); } }
@Override public char[] read(IUnitChain unitChain) { final ByteBufferArray bba = ByteBufferArray.get(); try { IUnit unit = unitChain.currentUnit(); bba.add(unit.getByteBufferForRead(unit.position(), unit.remaining())); unit.position(unit.size()); while ((unit = unitChain.nextUnit()) != null) { bba.add(unit.getByteBufferForRead(unit.position(), unit.remaining())); unit.position(unit.size()); } final ICharsetCodec cc = CharsetCodec.get(m_charsetName); return cc.decode(bba.array(), 0, bba.size()); } finally { bba.clear(); } }
@Override public char[] read(IUnitChain unitChain, int length) { if (length < 0) throw new IllegalArgumentException(); if (length == 0) return Helper.EMPTY_CHARS; final ByteBufferArray bba = ByteBufferArray.get(); try { IUnit unit = unitChain.currentUnit(); bba.add(unit.getByteBufferForRead(unit.position(), length)); while ((length -= unit.skip(length)) > 0) { unit = unitChain.nextUnit(); bba.add(unit.getByteBufferForRead(unit.position(), length)); } final ICharsetCodec cc = CharsetCodec.get(m_charsetName); return cc.decode(bba.array(), 0, bba.size()); } finally { bba.clear(); } }
@Override public char[] get(IUnitChain unitChain, int index, int length) { if (length < 0) throw new IndexOutOfBoundsException(); if (length == 0) return Helper.EMPTY_CHARS; final ByteBufferArray bba = ByteBufferArray.get(); try { IUnit unit = unitChain.currentUnit(); bba.add(unit.getByteBufferForRead(index, length)); length -= (unit.size() - index); while (length > 0) { unit = unitChain.nextUnit(); if (unit == null) throw new IndexOutOfBoundsException(); bba.add(unit.getByteBufferForRead(0, length)); length -= unit.size(); } final ICharsetCodec cc = CharsetCodec.get(m_charsetName); return cc.decode(bba.array(), 0, bba.size()); } finally { bba.clear(); } }