#include "ATOOLS/Math/Axis.H"

using namespace ATOOLS;

template <class ValueType>
Axis<ValueType>::Axis():
  m_scalingmode(Reference),
  p_variable(Variable_Getter::GetObject("","")),
  p_scaling(Scaling_Getter::GetObject("","")) {}

template <class ValueType>
Axis<ValueType>::Axis(const Axis &ref):
  m_scalingmode(ref.m_scalingmode),
  p_variable(Variable_Getter::GetObject(ref.p_variable->Name(),
					ref.p_variable->Name())),
  p_scaling(Scaling_Getter::GetObject(ref.p_scaling->Name(),
				      ref.p_scaling->Name())) {}

template <class ValueType>
Axis<ValueType>::~Axis() 
{
  delete p_variable;
  delete p_scaling;
}

template <class ValueType>
ValueType Axis<ValueType>::DisplayedValue(const Value_Type &realvalue,
					  ScalingModeID tempsmode) const
{
  if (tempsmode==Unknown) tempsmode=m_scalingmode;
  switch (tempsmode) {
  case Reference:
    return (*p_scaling)(realvalue);
    break;
  case Unknown:
  case Identical:
    return realvalue;
    break;
  }
  return (Value_Type)0.0;
}

template <class ValueType>
ValueType Axis<ValueType>::RealValue(const Value_Type &displayedvalue,
				     ScalingModeID tempsmode) const
{
  if (tempsmode==Unknown) tempsmode=m_scalingmode;
  switch (tempsmode) {
  case Reference:
    return (*p_scaling)[displayedvalue];
    break;
    case Unknown:
  case Identical:
    return displayedvalue;
    break;
  }
  return (Value_Type)0.0;
}

template <class ValueType>
void Axis<ValueType>::SetScaling(const std::string &scalename)
{
  p_scaling=Scaling_Getter::GetObject(scalename,scalename);
  if (p_scaling==NULL) p_scaling=Scaling_Getter::GetObject("","");
}

template <class ValueType>
void Axis<ValueType>::SetVariable(const std::string &variablename)
{
  p_variable=Variable_Getter::GetObject(variablename,variablename);
  if (p_variable==NULL) p_variable=Variable_Getter::GetObject("","");
}

template <class ValueType>
ValueType Axis<ValueType>::operator()(const Value_Type &realvalue) const
{ 
  return DisplayedValue(realvalue,Unknown); 
}

template <class ValueType>
ValueType Axis<ValueType>::operator[](const Value_Type &displayedvalue) const
{ 
  return RealValue(displayedvalue,Unknown); 
}
    
template <class ValueType>
void Axis<ValueType>::SetScalingMode(const ScalingModeID &scalingmode)
{ 
  m_scalingmode=scalingmode; 
}

template <class ValueType>
typename Axis<ValueType>::ScalingModeID Axis<ValueType>::ScalingMode() const 
{
  return m_scalingmode; 
}

template <class ValueType>
void Axis<ValueType>::SetScaling(Scaling_Base<Value_Type> *const scaling)
{
  p_scaling=scaling; 
}

template <class ValueType>
const Scaling_Base<ValueType> *Axis<ValueType>::Scaling() const 
{ 
  return p_scaling;  
}

template <class ValueType>
void Axis<ValueType>::SetVariable(Variable_Base<Value_Type> *const variable)
{
  p_variable=variable; 
}

template <class ValueType>
const Variable_Base<ValueType> *Axis<ValueType>::Variable() const
{
  return p_variable; 
}

template class ATOOLS::Axis<double>;