001 /* 002 * Copyright (C) 2008-2010 by Holger Arndt 003 * 004 * This file is part of the Universal Java Matrix Package (UJMP). 005 * See the NOTICE file distributed with this work for additional 006 * information regarding copyright ownership and licensing. 007 * 008 * UJMP is free software; you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation; either version 2 011 * of the License, or (at your option) any later version. 012 * 013 * UJMP is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU Lesser General Public License for more details. 017 * 018 * You should have received a copy of the GNU Lesser General Public 019 * License along with UJMP; if not, write to the 020 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 021 * Boston, MA 02110-1301 USA 022 */ 023 024 package org.ujmp.core.util.io; 025 026 import java.io.IOException; 027 import java.io.OutputStream; 028 029 public class RingBufferOutputStream extends OutputStream { 030 031 private int start = -1; 032 033 private int end = -1; 034 035 private final byte values[]; 036 037 public RingBufferOutputStream() { 038 this(10); 039 } 040 041 public RingBufferOutputStream(int maximumSize) { 042 values = new byte[maximumSize]; 043 } 044 045 public int maxSize() { 046 return values.length; 047 } 048 049 public boolean add(byte a) { 050 if (end >= 0) { 051 end++; 052 if (end >= values.length) { 053 end = 0; 054 } 055 if (end == start) { 056 start++; 057 } 058 if (start >= values.length) { 059 start = 0; 060 } 061 } else { 062 start = 0; 063 end = 0; 064 } 065 values[end] = a; 066 return true; 067 } 068 069 public int size() { 070 if (end < 0) { 071 return 0; 072 } 073 return end < start ? values.length : end - start + 1; 074 } 075 076 077 public String toString() { 078 StringBuilder s = new StringBuilder(); 079 for (int i = 0; i < size(); i++) { 080 s.append((char) get(i)); 081 } 082 return s.toString(); 083 } 084 085 public byte get(int index) { 086 return values[(start + index) % values.length]; 087 } 088 089 public byte set(int index, byte a) { 090 byte old = values[(start + index) % values.length]; 091 values[(start + index) % values.length] = a; 092 return old; 093 } 094 095 public void clear() { 096 start = -1; 097 end = -1; 098 } 099 100 public void add(int index, char element) { 101 new Exception("not implemented").printStackTrace(); 102 } 103 104 public boolean isEmpty() { 105 return size() == 0; 106 } 107 108 109 public void write(int b) throws IOException { 110 add((byte) b); 111 } 112 113 }