package me.ag2s.umdlib.tool;

import java.io.IOException;
import java.io.OutputStream;

public class WrapOutputStream extends OutputStream {
	
	private final OutputStream os;
	private int written;

	public WrapOutputStream(OutputStream os) {
		this.os = os;
	}
	
    private void incCount(int value) {
        int temp = written + value;
        if (temp < 0) {
            temp = Integer.MAX_VALUE;
        }
        written = temp;
    }
	
    // it is different from the writeInt of DataOutputStream
	public void writeInt(int v) throws IOException {
        os.write((v >>>  0) & 0xFF);
        os.write((v >>>  8) & 0xFF);
        os.write((v >>> 16) & 0xFF);
        os.write((v >>> 24) & 0xFF);
		incCount(4);
	}
	
	public void writeByte(byte b) throws IOException {
		write(b);
	}
	
	public void writeByte(int n) throws IOException {
		write(n);
	}
	
	public void writeBytes(byte ... bytes) throws IOException {
		write(bytes);
	}
	
	public void writeBytes(int ... vals) throws IOException {
		for (int v : vals) {
			write(v);
		}
	}

	public void write(byte[] b, int off, int len) throws IOException {
		os.write(b, off, len);
		incCount(len);
	}

	public void write(byte[] b) throws IOException {
		os.write(b);
		incCount(b.length);
	}

	public void write(int b) throws IOException {
		os.write(b);
		incCount(1);
	}
	
	/////////////////////////////////////////////////

	public void close() throws IOException {
		os.close();
	}

	public void flush() throws IOException {
		os.flush();
	}

	public boolean equals(Object obj) {
		return os.equals(obj);
	}

	public int hashCode() {
		return os.hashCode();
	}

	public String toString() {
		return os.toString();
	}

	public int getWritten() {
		return written;
	}

}
