/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.formula;
import java.util.List;
import org.diirt.datasource.ReadRecipeBuilder;
import org.diirt.datasource.ReadFunction;
import org.diirt.datasource.expression.DesiredRateExpression;
import org.diirt.datasource.expression.DesiredRateExpressionImpl;
import org.diirt.datasource.expression.DesiredRateExpressionList;
import static org.diirt.datasource.ExpressionLanguage.*;
import org.diirt.datasource.PVDirector;
/**
*
* @author carcassi
*/
class LastOfChannelExpression<T> implements DesiredRateExpression<T> {
private final DesiredRateExpression<T> expression;
private final Class<T> clazz;
public LastOfChannelExpression(String name, Class<T> clazz) {
this.expression = latestValueOf(channel(name, clazz, Object.class));
this.clazz = clazz;
}
@Override
public DesiredRateExpression<T> as(String name) {
return expression.as(name);
}
@Override
public String getName() {
return expression.getName();
}
@Override
public void fillReadRecipe(PVDirector director, ReadRecipeBuilder builder) {
expression.fillReadRecipe(director, builder);
}
@Override
public ReadFunction<T> getFunction() {
return expression.getFunction();
}
@Override
public DesiredRateExpressionImpl<T> getDesiredRateExpressionImpl() {
return expression.getDesiredRateExpressionImpl();
}
@Override
public DesiredRateExpressionList<T> and(DesiredRateExpressionList<? extends T> expressions) {
return expression.and(expressions);
}
@Override
public List<DesiredRateExpression<T>> getDesiredRateExpressions() {
return expression.getDesiredRateExpressions();
}
public <N> LastOfChannelExpression<N> cast(Class<N> clazz) {
if (clazz.isAssignableFrom(this.clazz)) {
@SuppressWarnings("unchecked")
LastOfChannelExpression<N> result = (LastOfChannelExpression<N>) this;
return result;
}
if (this.clazz.isAssignableFrom(clazz)) {
return new LastOfChannelExpression<N>(getName(), clazz);
}
throw new IllegalArgumentException("Cannot cast expression of type " + this.clazz + " to type " + clazz);
}
public Class<T> getType() {
return clazz;
}
}