
#ifndef FRAMELIB_COMPLEX_UNARY_OBJECTS_H
#define FRAMELIB_COMPLEX_UNARY_OBJECTS_H

#include "FrameLib_Complex_Unary_Template.h"

#include <functional>

// Complex Unary (functions)

// Info specialisations

template<> inline const char *FrameLib_Complex_Unary<std::cos<double>>::getOpString()      { return "cosine"; }
template<> inline const char *FrameLib_Complex_Unary<std::sin<double>>::getOpString()      { return "sine"; }
template<> inline const char *FrameLib_Complex_Unary<std::tan<double>>::getOpString()      { return "tangent"; }
template<> inline const char *FrameLib_Complex_Unary<std::cosh<double>>::getOpString()     { return "hyperbolic cosine"; }
template<> inline const char *FrameLib_Complex_Unary<std::sinh<double>>::getOpString()     { return "hyperbolic sine"; }
template<> inline const char *FrameLib_Complex_Unary<std::tanh<double>>::getOpString()     { return "hyperbolic tangent"; }

template<> inline const char *FrameLib_Complex_Unary<std::log<double>>::getOpString()      { return "logarithm base e"; }
template<> inline const char *FrameLib_Complex_Unary<std::log10<double>>::getOpString()    { return "logarithm base 10"; }
template<> inline const char *FrameLib_Complex_Unary<std::exp<double>>::getOpString()      { return "exponent base e (e^x)"; }

template<> inline const char *FrameLib_Complex_Unary<std::sqrt<double>>::getOpString()     { return "square root"; }

template<> inline const char *FrameLib_Complex_Unary<std::conj<double>>::getOpString()     { return "complex conjugate"; }

// Type definitions

typedef FrameLib_Complex_Unary<std::cos<double>>        FrameLib_Complex_Cos;
typedef FrameLib_Complex_Unary<std::sin<double>>        FrameLib_Complex_Sin;
typedef FrameLib_Complex_Unary<std::tan<double>>        FrameLib_Complex_Tan;
typedef FrameLib_Complex_Unary<std::cosh<double>>       FrameLib_Complex_Cosh;
typedef FrameLib_Complex_Unary<std::sinh<double>>       FrameLib_Complex_Sinh;
typedef FrameLib_Complex_Unary<std::tanh<double>>       FrameLib_Complex_Tanh;

typedef FrameLib_Complex_Unary<std::log<double>>        FrameLib_Complex_Log;
typedef FrameLib_Complex_Unary<std::log10<double>>      FrameLib_Complex_Log10;
typedef FrameLib_Complex_Unary<std::exp<double>>        FrameLib_Complex_Exp;

typedef FrameLib_Complex_Unary<std::sqrt<double>>       FrameLib_Complex_Sqrt;

typedef FrameLib_Complex_Unary<std::conj<double>>       FrameLib_Complex_Conj;

#endif
