/*
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2007 Marcelo Vanzin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.buffer;
/**
* A read-only text segment from a buffer. Allows concatenation using a
* "linked list" approach.
*
* @author Marcelo Vanzin
* @version $Id: BufferSegment.java 21971 2012-08-02 20:32:37Z jarekczek $
* @since jEdit 4.3pre15
*/
class BufferSegment implements CharSequence
{
public BufferSegment(char[] data,
int offset,
int len)
{
this(data,offset,len,null);
}
public BufferSegment(char[] data,
int offset,
int len,
BufferSegment next)
{
this.data = data;
this.offset = offset;
this.len = len;
this.next = next;
}
public char charAt(int index)
{
if (index < len)
return data[offset+index];
else if (next != null)
return next.charAt(index-len);
else
throw new ArrayIndexOutOfBoundsException(index);
}
public int length()
{
return len + ((next != null) ? next.length() : 0);
}
public CharSequence subSequence(int start,
int end)
{
return subSegment(start, end);
}
public String toString()
{
StringBuilder sb = new StringBuilder();
toString(sb);
return sb.toString();
}
private void toString(StringBuilder sb)
{
sb.append(data,offset,len);
if (next != null)
next.toString(sb);
}
private BufferSegment subSegment(int start,
int end)
{
if (0 <= start && start <= end)
if (end <= len)
return new BufferSegment(data,offset+start,
end-start);
else if (next != null)
if (start < len)
return new BufferSegment(data,
offset+start,len-start,
next.subSegment(0,end-len));
else
return next.subSegment(start-len,
end-len);
else
throw new ArrayIndexOutOfBoundsException();
else
throw new ArrayIndexOutOfBoundsException();
}
private final char[] data;
private final int offset;
private final int len;
private final BufferSegment next;
}