// Path: src/main/java/net/utp4j/data/bytes/UnsignedTypesUtil.java
// public static byte longToUbyte(long longvalue) {
// 	if (longvalue > MAX_UBYTE) {
// 		throw new ByteOverflowException(getExceptionText(MAX_UBYTE, longvalue));
// 	} else if (longvalue < 0) {
// 		throw new SignedNumberException(getExceptionText(MAX_UBYTE, longvalue));
// 	}
// 	return (byte) (longvalue & 0xFF);
// }


import static net.utp4j.data.bytes.UnsignedTypesUtil.longToUbyte;
import java.util.Arrays;

/* Copyright 2013 Ivan Iljkic
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package net.utp4j.data;


/**
 * Selective ACK header extension.
 * @author Ivan Iljkic (i.iljkic@gmail.com)
 *
 */
public class SelectiveAckHeaderExtension extends UtpHeaderExtension {

	private byte nextExtension;
	private byte[] bitMask;
	
	/* Bit mappings */
	public static byte[] BITMAP = { 1, 2, 4, 8, 16, 32, 64, (byte) 128};
	
	/**
	 * true if the ACK+number-th bit is set to 1 in the bitmask
	 * @param bitmask bitmask
	 * @param number number
	 * @return true if bit is set, otherwise false. 
	 */
	public static boolean isBitMarked(byte bitmask, int number) {
		if (number < 2 || number > 9 ) {
			return false;
		} else {
			boolean returnvalue = (BITMAP[number - 2] & bitmask) == BITMAP[number - 2];
			return returnvalue;
		}
	}
	
	@Override
	public byte getNextExtension() {
		return nextExtension;
	}
	@Override
	public void setNextExtension(byte nextExtension) {
		this.nextExtension = nextExtension;
	}
	@Override
	public byte getLength() {

// Path: src/main/java/net/utp4j/data/bytes/UnsignedTypesUtil.java
// public static byte longToUbyte(long longvalue) {
// 	if (longvalue > MAX_UBYTE) {
// 		throw new ByteOverflowException(getExceptionText(MAX_UBYTE, longvalue));
// 	} else if (longvalue < 0) {
// 		throw new SignedNumberException(getExceptionText(MAX_UBYTE, longvalue));
// 	}
// 	return (byte) (longvalue & 0xFF);
// }


// Path: src/main/java/net/utp4j/data/SelectiveAckHeaderExtension.java
import static net.utp4j.data.bytes.UnsignedTypesUtil.longToUbyte;
import java.util.Arrays;

/* Copyright 2013 Ivan Iljkic
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package net.utp4j.data;


/**
 * Selective ACK header extension.
 * @author Ivan Iljkic (i.iljkic@gmail.com)
 *
 */
public class SelectiveAckHeaderExtension extends UtpHeaderExtension {

	private byte nextExtension;
	private byte[] bitMask;
	
	/* Bit mappings */
	public static byte[] BITMAP = { 1, 2, 4, 8, 16, 32, 64, (byte) 128};
	
	/**
	 * true if the ACK+number-th bit is set to 1 in the bitmask
	 * @param bitmask bitmask
	 * @param number number
	 * @return true if bit is set, otherwise false. 
	 */
	public static boolean isBitMarked(byte bitmask, int number) {
		if (number < 2 || number > 9 ) {
			return false;
		} else {
			boolean returnvalue = (BITMAP[number - 2] & bitmask) == BITMAP[number - 2];
			return returnvalue;
		}
	}
	
	@Override
	public byte getNextExtension() {
		return nextExtension;
	}
	@Override
	public void setNextExtension(byte nextExtension) {
		this.nextExtension = nextExtension;
	}
	@Override
	public byte getLength() {

		return longToUbyte(bitMask.length);
