CompactDataOutput.java revision e69ba4dbb015949c5d84ba7bbb0b53efac28bb23
1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/******************************************************************************* 2e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Copyright (c) 2009, 2012 Mountainminds GmbH & Co. KG and Contributors 3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials 4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0 5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at 6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html 7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors: 9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Marc R. Hoffmann - initial API and implementation 10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/ 12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.internal.data; 13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.DataOutputStream; 15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.IOException; 16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.OutputStream; 17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/** 19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Additional data output methods for compact storage of data structures. 20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @see CompactDataInput 22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class CompactDataOutput extends DataOutputStream { 24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Creates a new {@link CompactDataOutput} instance that writes data to the 27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * specified underlying output stream 28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param out 30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * underlying output stream 31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public CompactDataOutput(final OutputStream out) { 33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov super(out); 34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Writes a variable length representation of an integer value that reduces 38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * the number of written bytes for small positive values. Depending on the 39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * given value 1 to 5 bytes will be written to the underlying stream. 40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param value 42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * value to write 43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void writeVarInt(final int value) throws IOException { 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if ((value & 0xFFFFFF80) == 0) { 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(value); 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } else { 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(0x80 | (value & 0x7F)); 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeVarInt(value >>> 7); 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Writes a boolean array. Internally a sequence of boolean values is packed 56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * into single bits. 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param value 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * boolean array 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void writeBooleanArray(final boolean[] value) throws IOException { 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeVarInt(value.length); 64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov int buffer = 0; 65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov int bufferSize = 0; 66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (final boolean b : value) { 67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (b) { 68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer |= 0x01 << bufferSize; 69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (++bufferSize == 8) { 71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(buffer); 72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer = 0; 73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov bufferSize = 0; 74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (bufferSize > 0) { 77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(buffer); 78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 82