#ifndef __LUT_H__
#define __LUT_H__
template <int LBound = -128, int UBound = 127, class TResult = double, int ScaleFactor = 1>
class LUT_number
{
public:
explicit LUT_number (double val = 0)
{
lut = lut_array - LBound;
for (int i = LBound; i <= UBound; i++)
{
lut[i] = i * ScaleFactor * val;
}
}
const TResult & operator* (int val) const
{
return lut[val];
}
private:
TResult lut_array[UBound - LBound + 1];
TResult * lut;
};
template <int LBound, int UBound, class TResult, int ScaleFactor>
inline const TResult & operator* (int val, const LUT_number<LBound, UBound,
TResult, ScaleFactor> & coeff)
{
return coeff * val;
}
template <int LBound = -128, int UBound = 127, class TResult = double, class TArg = double>
class LUT_function
{
public:
explicit LUT_function (TResult (*f) (TArg), double coeff = 1)
{
lut = lut_array - LBound;
for (int i = LBound; i <= UBound; i++)
{
lut[i] = f(coeff * i);
}
}
const TResult & operator() (int i) const
{
return lut[i];
}
private:
TResult lut_array[UBound - LBound + 1];
TResult * lut;
};
#endif