1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/******************************************************************************* 2398ee59bebad6835dab57b60157eff16d511709eMarc R. Hoffmann * Copyright (c) 2009, 2015 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 4457f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann * if thrown by the underlying stream 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void writeVarInt(final int value) throws IOException { 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if ((value & 0xFFFFFF80) == 0) { 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(value); 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } else { 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(0x80 | (value & 0x7F)); 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeVarInt(value >>> 7); 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Writes a boolean array. Internally a sequence of boolean values is packed 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * into single bits. 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param value 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * boolean array 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 6257f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann * if thrown by the underlying stream 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public void writeBooleanArray(final boolean[] value) throws IOException { 65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeVarInt(value.length); 66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov int buffer = 0; 67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov int bufferSize = 0; 68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (final boolean b : value) { 69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (b) { 70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer |= 0x01 << bufferSize; 71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (++bufferSize == 8) { 73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(buffer); 74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer = 0; 75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov bufferSize = 0; 76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if (bufferSize > 0) { 79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov writeByte(buffer); 80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 82e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 83e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 84