/*******************************************************************************
 * ALMA - Atacama Large Millimiter Array
 * (c) Instituto de Estructura de la Materia, 2009
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 *
 * "@(#) $Id: ATMLength.cpp Exp $"
 *
 * who       when      what
 * --------  --------  ----------------------------------------------
 * pardo     24/03/09  created
 */


#include "ATMLength.h"
#include <stdio.h>



ATM_NAMESPACE_BEGIN

Length::Length() :
  valueIS_(0.0)
{
}

Length::Length(double length) :
  valueIS_(length)
{
}

Length::Length(double length, const std::string &units)
{
  valueIS_ = sput(length, units);
}

Length::Length(double length, Length::Units units)
{
  valueIS_ = sput(length, units);
}

Length::Length(const Length &length) :
  valueIS_(length.valueIS_)
{
}

Length::~Length()
{
}

double Length::sget(double value, const std::string &units)
{
  if(units == "km" || units == "KM") {
    return 1.0E-3 * value;
  } else if(units == "m" || units == "M") {
    return value;
  } else if(units == "mm" || units == "MM") {
    return 1.0E+3 * value;
  } else if(units == "micron" || units == "MICRON") {
    return 1.0E+6 * value;
  } else if(units == "microns" || units == "MICRONS") {
    return 1.0E+6 * value;
  } else if(units == "nm" || units == "NM") {
    return 1.0E+9 * value;
  } else {
    return value;
  }
}

double Length::sput(double value, const std::string &units)
{
  if(units == "km" || units == "KM") {
    return 1.0E+3 * value;
  } else if(units == "m" || units == "M") {
    return value;
  } else if(units == "mm" || units == "MM") {
    return 1.0E-3 * value;
  } else if(units == "micron" || units == "MICRON") {
    return 1.0E-6 * value;
  } else if(units == "nm" || units == "NM") {
    return 1.0E-9 * value;
  } else {
    return value;
  }
}

double Length::sget(double value, Length::Units units)
{
  if(units == Length::UnitKiloMeter) {
    return 1.0E-3 * value;
  } else if(units == Length::UnitMeter) {
    return value;
  } else if(units == Length::UnitMilliMeter) {
    return 1.0E+3 * value;
  } else if(units == Length::UnitMicron || Length::UnitMicrons) {
    return 1.0E+6 * value;
  } else if(units == Length::UnitNanoMeter) {
    return 1.0E+9 * value;
  } else {
    return value;
  }
}

double Length::sput(double value, Length::Units units)
{
  if(units == Length::UnitKiloMeter) {
    return 1.0E+3 * value;
  } else if(units == Length::UnitMeter) {
    return value;
  } else if(units == Length::UnitMilliMeter) {
    return 1.0E-3 * value;
  } else if(units == Length::UnitMicron || units == Length::UnitMicrons) {
    return 1.0E-6 * value;
  } else if(units == Length::UnitNanoMeter) {
    return 1.0E-9 * value;
  } else {
    return value;
  }
}


/*
std::string Length::get(const std::string &form, const std::string &units) const
  {
    char myString[18];

    sprintf(myString, "%f %s", get(units), units.c_str());


    return std::string(myString);
    }
*/

ATM_NAMESPACE_END