/*
Copyright (C) 2012, Tórur Biskopstø Strøm (torur.strom@gmail.com)
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 3 of the License, or
(at your option) 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, see <http://www.gnu.org/licenses/>.
*/
package org.reprap;
public class CharacterBuffer
{
private char[] chars;
private int count = 0;
private int position = 0;
public CharacterBuffer(int size)
{
chars = new char[size];
}
//Creates new array but is only used inside handleAsyncEvent
synchronized public int copy(char[] buffer)
{
if(buffer == null)
{
return 0;
}
int amount = buffer.length;
if(amount > count)
{
amount = count;
}
int length = chars.length;
int start;
if(count > position)
{
start = length-(count-position);
}
else
{
start = position-count;
}
count -= amount;
int j = 0;
int remainder = amount;
if((start+remainder) > length)
{
for (int i = start; i < length; i++) //@WCA loop=1
{
buffer[j++] = chars[i];
}
remainder -= (length-start);
start = 0;
}
for (int i = start; i < remainder+start; i++) //@WCA loop=64
{
buffer[j++] = chars[i];
}
return amount;
}
synchronized public boolean add(char character)
{
if(chars.length > count)
{
chars[position] = character;
count++;
position++;
if(position == chars.length)
{
position = 0;
}
return true;
}
return false;
}
synchronized public void add(char[] characters)
{
if(characters == null || chars.length < count+characters.length)
{
return;
}
for(int i = 0; i < characters.length; i++) //@WCA loop=64
{
chars[position] = characters[i];
position++;
if(position == chars.length)
{
position = 0;
}
}
count += characters.length;
}
synchronized public void add(char[] characters1,char[] characters2)
{
addUnSafe(characters1);
addUnSafe(characters2);
}
synchronized public void add(char[] characters1,char[] characters2,char[] characters3)
{
addUnSafe(characters1);
addUnSafe(characters2);
addUnSafe(characters3);
}
synchronized public void add(char[] characters1,char[] characters2,char[] characters3, char[] characters4)
{
addUnSafe(characters1);
addUnSafe(characters2);
addUnSafe(characters3);
addUnSafe(characters4);
}
synchronized public void add(char[] characters1,char[] characters2,char[] characters3, char[] characters4, char[] characters5)
{
addUnSafe(characters1);
addUnSafe(characters2);
addUnSafe(characters3);
addUnSafe(characters4);
addUnSafe(characters5);
}
private void addUnSafe(char[] characters)
{
if(characters == null)
{
return;
}
int length = characters.length;
if(chars.length < count+length)
{
length = chars.length-count;
}
for(int i = 0; i < length; i++) //@WCA loop=64
{
chars[position] = characters[i];
position++;
if(position == chars.length)
{
position = 0;
}
}
count += length;
}
}