#ifndef _NICE_OBJREC_GENERICDISTANCESELECTION_INCLUDE
#define _NICE_OBJREC_GENERICDISTANCESELECTION_INCLUDE

#include <core/vector/Distance.h>

namespace OBJREC
{

class GenericDistanceSelection
{
  public:

    static NICE::VectorDistance<double> *selectDistance (
      std::string distance_type )
    {
      NICE::VectorDistance<double> *distance = NULL;

      if ( distance_type == "euclidean" )
      {
        distance = new NICE::EuclidianDistance<double>();
      }
      else if ( distance_type == "manhattan" || distance_type == "cityblock" )
      {
        distance = new NICE::ManhattanDistance<double>();
      }
      else if ( distance_type == "median" )
      {
        distance = new NICE::MedianDistance<double>();
      }
      else if ( distance_type == "cosinus" )
      {
        distance = new NICE::CosDistance<double>();
      }
      else if ( distance_type == "spherical" )
      {
        distance = new NICE::SphericalDistance<double>();
      }
      else if ( distance_type == "chisquare" || distance_type == "chi2" )
      {
        distance = new NICE::Chi2Distance<double>();

      }
      else if ( distance_type == "kl" || distance_type == "kullbackleibler" )
      {
        distance = new NICE::KLDistance<double>();
      }
      else if ( distance_type == "bhattacharyya" )
      {
        distance = new NICE::BhattacharyyaDistance<double>();
      }
      else
      {
        fthrow ( NICE::Exception, "Distance type " << distance_type << " is unknown - euclidean distance used" );
        distance = new NICE::EuclidianDistance<double>();
      }

      return distance;
    }

};
} //namespace
#endif
