blob: 10786c45b11a81d0cf24865a8e5d127053aea450 [file] [log] [blame]
/**
* 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 com.datatorrent.lib.util;
import javax.validation.constraints.NotNull;
/**
* This is an abstract operator,
* which provides a base implementation for operators which work with key value pairs,
* where the values are numbers.
* <p>
* Provides basic methods for value conversion<p>
* <br>
* <b>Benchmarks</b>: Not done as emit is done by sub-classes<br>
* </p>
* @displayName Base Number Key Value
* @category Algorithmic
* @tags numeric, key value
* @since 0.3.2
*/
public class BaseNumberKeyValueOperator<K,V extends Number> extends BaseFilteredKeyValueOperator<K,V>
{
public enum V_TYPE
{
DOUBLE, INTEGER, FLOAT, LONG, SHORT, UNKNOWN
}
@NotNull
V_TYPE type = V_TYPE.DOUBLE;
/**
* This call ensures that type enum is set at setup time. At run time a switch statement suffices
* If you derive your
* @param ctype the type to set the operator to
*/
public void setType(Class<V> ctype)
{
if (ctype == Double.class) {
type = V_TYPE.DOUBLE;
} else if (ctype == Integer.class) {
type = V_TYPE.INTEGER;
} else if (ctype == Float.class) {
type = V_TYPE.FLOAT;
} else if (ctype == Long.class) {
type = V_TYPE.LONG;
} else if (ctype == Short.class) {
type = V_TYPE.SHORT;
} else {
type = V_TYPE.UNKNOWN;
}
}
/**
* This is a constructor provided to clone Number. Since V is instantiation time and not known during module creation, a copy
* is needed. Currently only the following are supported: Double, Integer, Float, Long, and Short. If you derive your own class from Number
* then you need to override getValue to help make a correct copy.
* @param num to clone from
* @return value as a correct sub-class (V) object
*/
@SuppressWarnings("unchecked")
public V getValue(Number num)
{
Number val;
switch (type) {
case DOUBLE:
val = num.doubleValue();
break;
case INTEGER:
val = num.intValue();
break;
case FLOAT:
val = num.floatValue();
break;
case LONG:
val = num.longValue();
break;
case SHORT:
val = num.shortValue();
break;
default:
val = num.doubleValue();
break;
}
return (V)val;
}
}