/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.wicket.util.value;
import java.io.Serializable;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Primitives;
/**
* A base class based on the Java <code>long</code> primitive for value classes that want to
* implement standard operations on that value without the pain of aggregating a <code>Long</code>
* object.
*
* @author Jonathan Locke
* @since 1.2.6
*/
public class LongValue implements Comparable<LongValue>, Serializable
{
private static final long serialVersionUID = 1L;
/** the <code>long</code> value */
protected final long value;
/**
* Constructor.
*
* @param value
* the <code>long</code> value
*/
public LongValue(final long value)
{
this.value = value;
}
/**
* Compares this <code>Object</code> to a given <code>Object</code>.
*
* @param that
* the <code>Object</code> to compare with
* @return 0 if equal, -1 if less than the given <code>Object</code>'s value, or 1 if greater
* than given <code>Object</code>'s value
*/
@Override
public final int compareTo(final LongValue that)
{
if (value < that.value)
{
return -1;
}
if (value > that.value)
{
return 1;
}
return 0;
}
/**
* Tests for equality.
*
* @param that
* the <code>Object</code> to compare with
* @return <code>true</code> if this <code>Object</code>'s value is equal to the given
* <code>Object</code>'s value
*/
@Override
public final boolean equals(final Object that)
{
if (that instanceof LongValue)
{
return value == ((LongValue)that).value;
}
return false;
}
/**
* Compares this <code>LongValue</code> with a primitive <code>long</code> value.
*
* @param value
* the <code>long</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is greater than the given
* <code>long</code> value
*/
public final boolean greaterThan(final long value)
{
return this.value > value;
}
/**
* Compares this <code>LongValue</code> with a primitive <code>long</code> value.
*
* @param value
* the <code>long</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is greater than or equal to the
* given <code>long</code> value
*/
public final boolean greaterThanOrEqual(final long value)
{
return this.value >= value;
}
/**
* Compares this <code>LongValue</code> with another <code>LongValue</code>.
*
* @param that
* the <code>LongValue</code> to compare with
* @return <code>true</code> if this <code>LongValue</code> is greater than the given
* <code>LongValue</code>
*/
public final boolean greaterThan(final LongValue that)
{
return value > that.value;
}
/**
* Compares this <code>LongValue</code> with another <code>LongValue</code>.
*
* @param that
* the <code>LongValue</code> to compare with
* @return <code>true</code> if this <code>LongValue</code> is greater than or equal to the
* given <code>LongValue</code>
*/
public final boolean greaterThanOrEqual(final LongValue that)
{
return value >= that.value;
}
/**
* Returns the hash code for this <code>Object</code>.
*
* @return hash code for this <code>Object</code>
*/
@Override
public final int hashCode()
{
return Primitives.hashCode(value);
}
/**
* Compares this <code>LongValue</code> with a primitive <code>long</code> value.
*
* @param that
* the <code>long</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is less than the given
* <code>long</code> value
*/
public final boolean lessThan(final long that)
{
return value < that;
}
/**
* Compares this <code>LongValue</code> with a primitive <code>long</code> value.
*
* @param that
* the <code>long</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is less than or equal to the given
* <code>long</code> value
*/
public final boolean lessThanOrEqual(final long that)
{
return value <= that;
}
/**
* Compares this <code>LongValue</code> with another <code>LongValue</code>.
*
* @param that
* the <code>LongValue</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is less than the given
* <code>LongValue</code>
*/
public final boolean lessThan(final LongValue that)
{
return value < that.value;
}
/**
* Compares this <code>LongValue</code> with another <code>LongValue</code>.
*
* @param that
* the <code>LongValue</code> value to compare with
* @return <code>true</code> if this <code>LongValue</code> is less than or equal to the given
* <code>LongValue</code>
*/
public final boolean lessThanOrEqual(final LongValue that)
{
return value <= that.value;
}
/**
* Converts this <code>LongValue</code> to a <code>String</code>.
*
* @return a <code>String</code> representation of this <code>LongValue</code>
*/
@Override
public String toString()
{
return String.valueOf(value);
}
/**
* Returns the max of the two long values.
*
* @param <T>
* @param lhs
* @param rhs
* @throws IllegalArgumentException
* if either argument is {@code null}
* @return max value
*/
public static <T extends LongValue> T max(final T lhs, final T rhs)
{
Args.notNull(lhs, "lhs");
Args.notNull(rhs, "rhs");
if (lhs.compareTo(rhs) > 0)
{
return lhs;
}
return rhs;
}
/**
* Null-safe version of {@link LongValue#max}. Nulls are considered less then any concrete
* value.
*
* @param <T>
* @param lhs
* @param rhs
* @return max of two values or {@code null} if they are both null
*/
public static <T extends LongValue> T maxNullSafe(final T lhs, final T rhs)
{
if (lhs == rhs)
{
return lhs;
}
else if (lhs == null)
{
return rhs;
}
else if (rhs == null)
{
return lhs;
}
return max(lhs, rhs);
}
}