All Downloads are FREE. Search and download functionalities are using the official Maven repository.

inet.ipaddr.format.standard.AddressBitsDivision Maven / Gradle / Ivy

There is a newer version: 5.5.1
Show newest version
/*
 * Copyright 2016-2018 Sean C Foley
 *
 * 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
 *     or at
 *     https://github.com/seancfoley/IPAddress/blob/master/LICENSE
 *
 * 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 inet.ipaddr.format.standard;

import inet.ipaddr.AddressValueException;
import inet.ipaddr.format.AddressDivisionBase;

/**
 * An address division for mac
 * 
 * @author sfoley
 *
 */
public class AddressBitsDivision extends AddressDivision {

	private static final long serialVersionUID = 4L;

	protected final int value; //the lower value
	protected final int upperValue; //the upper value of a range, if not a range it is the same as value
	private final int bitCount;
	private final int defaultRadix;
	
	/**
	 * Constructs a division with the given value, the given number of bits (which must be less than 32), and the given radix for printing the values.
	 * 
	 * @param value
	 * @param bitCount
	 * @param defaultRadix
	 */
	public AddressBitsDivision(int value, int bitCount, int defaultRadix) {
		this(value, value, bitCount, defaultRadix);
	}

	/**
	 * Constructs a division with the given value, the given number of bits (which must be less than 32), and the given radix for printing the values.
	 * 
	 * @param lower
	 * @param upper
	 * @param bitCount
	 * @param defaultRadix
	 */
	public AddressBitsDivision(int lower, int upper, int bitCount, int defaultRadix) {
		if(lower > upper) {
			int tmp = lower;
			lower = upper;
			upper = tmp;
		}
		if(lower < 0) {
			throw new AddressValueException(lower);
		} else if(bitCount < 0 || bitCount >= Integer.SIZE || defaultRadix < MIN_RADIX || defaultRadix > MAX_RADIX) {
			throw new IllegalArgumentException();
		}
		this.bitCount = bitCount;
		if(upper > getMaxValue()) {
			throw new AddressValueException(upper);
		}
		this.value = lower;
		this.upperValue = upper;
		this.defaultRadix = defaultRadix;
	}

	@Override
	public long getDivisionValue() {
		return value;
	}

	@Override
	public long getUpperDivisionValue() {
		return upperValue;
	}
	
	@Override
	protected byte[] getBytesImpl(boolean low) {
		return low ? new byte[] {
						(byte) (value >>> 24),
						(byte) (value >>> 16),
						(byte) (value >>> 8),
						(byte) value} : 
					new byte[] {
						(byte) (value >>> 24),
						(byte) (value >>> 16),
						(byte) (upperValue >>> 8),
						(byte) upperValue};
	}

	@Override
	public int getBitCount() {
		return bitCount;
	}

	@Override
	public int getMaxDigitCount() {
		return getMaxDigitCount(getDefaultTextualRadix(), getBitCount(), getMaxValue());
	}

	@Override
	protected boolean isSameValues(AddressDivisionBase other) {
		if(other instanceof AddressBitsDivision) {
			return isSameValues((AddressBitsDivision) other);
		}
		return false;
	}
	
	protected boolean isSameValues(AddressBitsDivision otherSegment) {
		//note that it is the range of values that matters, the prefix bits do not
		return  value == otherSegment.value && upperValue == otherSegment.upperValue;
	}
	
	@Override
	public boolean equals(Object other) {
		if(other == this) {
			return true;
		}
		if(other instanceof AddressBitsDivision) {
			AddressBitsDivision otherSegments = (AddressBitsDivision) other;
			return getBitCount() == otherSegments.getBitCount() && otherSegments.isSameValues(this);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return (int) (value | (upperValue << getBitCount()));
	}

	@Override
	public int getDefaultTextualRadix() {
		return defaultRadix;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy