    001/**
    002 *   Copyright (C) 2015 Typesafe Inc. <http://typesafe.com>
    003 */
    004package com.typesafe.config;
    005
    006import java.math.BigInteger;
    007
    008/**
    009 * An immutable class representing an amount of memory.  Use
    010 * static factory methods such as {@link
    011 * ConfigMemorySize#ofBytes(BigInteger)} to create instances.
    012 *
    013 * @since 1.3.0
    014 */
    015public final class ConfigMemorySize {
    016
    017    private BigInteger bytes;
    018
    019    private ConfigMemorySize(BigInteger bytes) {
    020        if (bytes.signum() < 0)
    021            throw new IllegalArgumentException("Attempt to construct ConfigMemorySize with negative number: " + bytes);
    022        this.bytes = bytes;
    023    }
    024
    025    /**
    026     * Constructs a ConfigMemorySize representing the given
    027     * number of bytes.
    028     * @since 1.3.0
    029     * @param bytes a number of bytes
    030     * @return an instance representing the number of bytes
    031     */
    032    public static ConfigMemorySize ofBytes(BigInteger bytes) {
    033        return new ConfigMemorySize(bytes);
    034    }
    035
    036    /**
    037     * Constructs a ConfigMemorySize representing the given
    038     * number of bytes.
    039     * @param bytes a number of bytes
    040     * @return an instance representing the number of bytes
    041     */
    042    public static ConfigMemorySize ofBytes(long bytes) {
    043        return new ConfigMemorySize(BigInteger.valueOf(bytes));
    044    }
    045
    046    /**
    047     * Gets the size in bytes.
    048     *
    049     * @since 1.3.0
    050     * @return how many bytes
    051     * @exception IllegalArgumentException when memory value
    052     * in bytes doesn't fit in a long value. Consider using
    053     * {@link #toBytesBigInteger} in this case.
    054     */
    055    public long toBytes() {
    056        if (bytes.bitLength() < 64)
    057            return bytes.longValue();
    058        else
    059            throw new IllegalArgumentException(
    060                "size-in-bytes value is out of range for a 64-bit long: '" + bytes + "'");
    061    }
    062
    063    /**
    064     * Gets the size in bytes. The behavior of this method
    065     * is the same as that of the {@link #toBytes()} method,
    066     * except that the number of bytes returned as a
    067     * BigInteger value. Use it when memory value in bytes
    068     * doesn't fit in a long value.
    069     * @return how many bytes
    070     */
    071    public BigInteger toBytesBigInteger() {
    072        return bytes;
    073    }
    074
    075    @Override
    076    public String toString() {
    077        return "ConfigMemorySize(" + bytes + ")";
    078    }
    079
    080    @Override
    081    public boolean equals(Object other) {
    082        if (other instanceof ConfigMemorySize) {
    083            return ((ConfigMemorySize)other).bytes.equals(this.bytes);
    084        } else {
    085            return false;
    086        }
    087    }
    088
    089    @Override
    090    public int hashCode() {
    091        // in Java 8 this can become Long.hashCode(bytes)
    092        return bytes.hashCode();
    093    }
    094
    095}
    096