/*
* This file is protected by Copyright. Please refer to the COPYRIGHT file
* distributed with this source distribution.
*
* This file is part of REDHAWK core.
*
* REDHAWK core is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* REDHAWK core is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package org.ossie.properties;
import org.omg.CORBA.Any;
import org.omg.CORBA.ORB;
abstract class NumericProperty<T extends Number> extends AbstractSimpleProperty<T> {
public NumericProperty(String id, String name, String type, T value, Mode mode,
Action action, Kind[] kinds) {
super(id, name, type, value, mode, action, kinds);
}
public NumericProperty(String id, String name, String type, T value, Mode mode,
Action action, Kind[] kinds, boolean optional) {
super(id, name, type, value, mode, action, kinds, optional);
}
public void setValue(Number value) {
this.value = fromNumber(value);
for (PropertyListener<Object> listener : voidListeners) {
listener.valueChanged(value, this.value);
}
}
protected T extract(Any any) {
try {
return fromNumber((Number)AnyUtils.convertAny(any));
} catch (ClassCastException ex) {
throw new IllegalArgumentException("Incorrect any type recevied");
}
}
protected abstract T fromNumber(Number value);
public boolean allocate(T capacity) {
if (compare(this.value, capacity) < 0) {
return false;
}
this.value = subtract(this.value, capacity);
return true;
}
public void deallocate(T capacity) {
this.value = add(this.value, capacity);
}
protected abstract int compare(T lhs, T rhs);
protected abstract T subtract(T lhs, T rhs);
protected abstract T add(T lhs, T rhs);
}