/*
 * Copyright (C) 2011, Google Inc. and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.util.io;

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

/**
 * Counts the number of bytes written.
 */
public class CountingOutputStream extends OutputStream {
	private final OutputStream out;
	private long cnt;

	/**
	 * Initialize a new counting stream.
	 *
	 * @param out
	 *            stream to output all writes to.
	 */
	public CountingOutputStream(OutputStream out) {
		this.out = out;
	}

	/**
	 * Get current number of bytes written.
	 *
	 * @return current number of bytes written.
	 */
	public long getCount() {
		return cnt;
	}

	/** {@inheritDoc} */
	@Override
	public void write(int val) throws IOException {
		out.write(val);
		cnt++;
	}

	/** {@inheritDoc} */
	@Override
	public void write(byte[] buf, int off, int len) throws IOException {
		out.write(buf, off, len);
		cnt += len;
	}

	/** {@inheritDoc} */
	@Override
	public void flush() throws IOException {
		out.flush();
	}

	/** {@inheritDoc} */
	@Override
	public void close() throws IOException {
		out.close();
	}
}
