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.DataInputStream; 15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.IOException; 16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.InputStream; 17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/** 19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Additional data input methods for compact storage of data structures. 20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @see CompactDataOutput 22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class CompactDataInput extends DataInputStream { 24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Creates a new {@link CompactDataInput} that uses the specified underlying 27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * input stream. 28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param in 30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * underlying input stream 31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public CompactDataInput(final InputStream in) { 33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov super(in); 34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Reads a variable length representation of an integer value. 38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @return read value 40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 4157f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann * if thrown by the underlying stream 42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public int readVarInt() throws IOException { 44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final int value = 0xFF & readByte(); 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if ((value & 0x80) == 0) { 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return value; 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return (value & 0x7F) | (readVarInt() << 7); 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Reads a boolean array. 53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @return boolean array 55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @throws IOException 5657f7cf06888f1e34f9ab2e3129c3d433826ecbe1Marc R. Hoffmann * if thrown by the underlying stream 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public boolean[] readBooleanArray() throws IOException { 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov final boolean[] value = new boolean[readVarInt()]; 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov int buffer = 0; 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (int i = 0; i < value.length; i++) { 62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if ((i % 8) == 0) { 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer = readByte(); 64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov value[i] = (buffer & 0x01) != 0; 66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov buffer >>>= 1; 67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return value; 69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 72