/*
 * ALMA - Atacama Large Millimeter Array
 * (c) European Southern Observatory, 2002
 * (c) Associated Universities Inc., 2002
 * Copyright by ESO (in the framework of the ALMA collaboration),
 * Copyright by AUI (in the framework of the ALMA collaboration),
 * All rights reserved.
 * 
 * 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
 * 
 * /////////////////////////////////////////////////////////////////
 * // WARNING!  DO NOT MODIFY THIS FILE!                          //
 * //  ---------------------------------------------------------  //
 * // | This is generated code!  Do not modify this file.       | //
 * // | Any changes will be lost when the file is re-generated. | //
 * //  ---------------------------------------------------------  //
 * /////////////////////////////////////////////////////////////////
 *
 * File CDirectionReferenceCode.cpp
 */
#include <sstream>
#include <alma/Enumerations/CDirectionReferenceCode.h>
#include <string>
using namespace std;

int CDirectionReferenceCode::version() {
	return DirectionReferenceCodeMod::version;
	}
	
string CDirectionReferenceCode::revision () {
	return DirectionReferenceCodeMod::revision;
}

unsigned int CDirectionReferenceCode::size() {
	return 32;
	}
	
	
const std::string& CDirectionReferenceCode::sJ2000 = "J2000";
	
const std::string& CDirectionReferenceCode::sJMEAN = "JMEAN";
	
const std::string& CDirectionReferenceCode::sJTRUE = "JTRUE";
	
const std::string& CDirectionReferenceCode::sAPP = "APP";
	
const std::string& CDirectionReferenceCode::sB1950 = "B1950";
	
const std::string& CDirectionReferenceCode::sB1950_VLA = "B1950_VLA";
	
const std::string& CDirectionReferenceCode::sBMEAN = "BMEAN";
	
const std::string& CDirectionReferenceCode::sBTRUE = "BTRUE";
	
const std::string& CDirectionReferenceCode::sGALACTIC = "GALACTIC";
	
const std::string& CDirectionReferenceCode::sHADEC = "HADEC";
	
const std::string& CDirectionReferenceCode::sAZELSW = "AZELSW";
	
const std::string& CDirectionReferenceCode::sAZELSWGEO = "AZELSWGEO";
	
const std::string& CDirectionReferenceCode::sAZELNE = "AZELNE";
	
const std::string& CDirectionReferenceCode::sAZELNEGEO = "AZELNEGEO";
	
const std::string& CDirectionReferenceCode::sJNAT = "JNAT";
	
const std::string& CDirectionReferenceCode::sECLIPTIC = "ECLIPTIC";
	
const std::string& CDirectionReferenceCode::sMECLIPTIC = "MECLIPTIC";
	
const std::string& CDirectionReferenceCode::sTECLIPTIC = "TECLIPTIC";
	
const std::string& CDirectionReferenceCode::sSUPERGAL = "SUPERGAL";
	
const std::string& CDirectionReferenceCode::sITRF = "ITRF";
	
const std::string& CDirectionReferenceCode::sTOPO = "TOPO";
	
const std::string& CDirectionReferenceCode::sICRS = "ICRS";
	
const std::string& CDirectionReferenceCode::sMERCURY = "MERCURY";
	
const std::string& CDirectionReferenceCode::sVENUS = "VENUS";
	
const std::string& CDirectionReferenceCode::sMARS = "MARS";
	
const std::string& CDirectionReferenceCode::sJUPITER = "JUPITER";
	
const std::string& CDirectionReferenceCode::sSATURN = "SATURN";
	
const std::string& CDirectionReferenceCode::sURANUS = "URANUS";
	
const std::string& CDirectionReferenceCode::sNEPTUNE = "NEPTUNE";
	
const std::string& CDirectionReferenceCode::sPLUTO = "PLUTO";
	
const std::string& CDirectionReferenceCode::sSUN = "SUN";
	
const std::string& CDirectionReferenceCode::sMOON = "MOON";
	
const std::vector<std::string> CDirectionReferenceCode::names() {
    std::vector<std::string> enumSet;
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sJ2000);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sJMEAN);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sJTRUE);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sAPP);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sB1950);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sB1950_VLA);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sBMEAN);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sBTRUE);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sGALACTIC);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sHADEC);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sAZELSW);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sAZELSWGEO);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sAZELNE);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sAZELNEGEO);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sJNAT);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sECLIPTIC);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sMECLIPTIC);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sTECLIPTIC);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sSUPERGAL);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sITRF);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sTOPO);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sICRS);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sMERCURY);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sVENUS);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sMARS);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sJUPITER);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sSATURN);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sURANUS);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sNEPTUNE);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sPLUTO);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sSUN);
    
    enumSet.insert(enumSet.end(), CDirectionReferenceCode::sMOON);
        
    return enumSet;
}

std::string CDirectionReferenceCode::name(const DirectionReferenceCodeMod::DirectionReferenceCode& f) {
    switch (f) {
    
    case DirectionReferenceCodeMod::J2000:
      return CDirectionReferenceCode::sJ2000;
    
    case DirectionReferenceCodeMod::JMEAN:
      return CDirectionReferenceCode::sJMEAN;
    
    case DirectionReferenceCodeMod::JTRUE:
      return CDirectionReferenceCode::sJTRUE;
    
    case DirectionReferenceCodeMod::APP:
      return CDirectionReferenceCode::sAPP;
    
    case DirectionReferenceCodeMod::B1950:
      return CDirectionReferenceCode::sB1950;
    
    case DirectionReferenceCodeMod::B1950_VLA:
      return CDirectionReferenceCode::sB1950_VLA;
    
    case DirectionReferenceCodeMod::BMEAN:
      return CDirectionReferenceCode::sBMEAN;
    
    case DirectionReferenceCodeMod::BTRUE:
      return CDirectionReferenceCode::sBTRUE;
    
    case DirectionReferenceCodeMod::GALACTIC:
      return CDirectionReferenceCode::sGALACTIC;
    
    case DirectionReferenceCodeMod::HADEC:
      return CDirectionReferenceCode::sHADEC;
    
    case DirectionReferenceCodeMod::AZELSW:
      return CDirectionReferenceCode::sAZELSW;
    
    case DirectionReferenceCodeMod::AZELSWGEO:
      return CDirectionReferenceCode::sAZELSWGEO;
    
    case DirectionReferenceCodeMod::AZELNE:
      return CDirectionReferenceCode::sAZELNE;
    
    case DirectionReferenceCodeMod::AZELNEGEO:
      return CDirectionReferenceCode::sAZELNEGEO;
    
    case DirectionReferenceCodeMod::JNAT:
      return CDirectionReferenceCode::sJNAT;
    
    case DirectionReferenceCodeMod::ECLIPTIC:
      return CDirectionReferenceCode::sECLIPTIC;
    
    case DirectionReferenceCodeMod::MECLIPTIC:
      return CDirectionReferenceCode::sMECLIPTIC;
    
    case DirectionReferenceCodeMod::TECLIPTIC:
      return CDirectionReferenceCode::sTECLIPTIC;
    
    case DirectionReferenceCodeMod::SUPERGAL:
      return CDirectionReferenceCode::sSUPERGAL;
    
    case DirectionReferenceCodeMod::ITRF:
      return CDirectionReferenceCode::sITRF;
    
    case DirectionReferenceCodeMod::TOPO:
      return CDirectionReferenceCode::sTOPO;
    
    case DirectionReferenceCodeMod::ICRS:
      return CDirectionReferenceCode::sICRS;
    
    case DirectionReferenceCodeMod::MERCURY:
      return CDirectionReferenceCode::sMERCURY;
    
    case DirectionReferenceCodeMod::VENUS:
      return CDirectionReferenceCode::sVENUS;
    
    case DirectionReferenceCodeMod::MARS:
      return CDirectionReferenceCode::sMARS;
    
    case DirectionReferenceCodeMod::JUPITER:
      return CDirectionReferenceCode::sJUPITER;
    
    case DirectionReferenceCodeMod::SATURN:
      return CDirectionReferenceCode::sSATURN;
    
    case DirectionReferenceCodeMod::URANUS:
      return CDirectionReferenceCode::sURANUS;
    
    case DirectionReferenceCodeMod::NEPTUNE:
      return CDirectionReferenceCode::sNEPTUNE;
    
    case DirectionReferenceCodeMod::PLUTO:
      return CDirectionReferenceCode::sPLUTO;
    
    case DirectionReferenceCodeMod::SUN:
      return CDirectionReferenceCode::sSUN;
    
    case DirectionReferenceCodeMod::MOON:
      return CDirectionReferenceCode::sMOON;
    	
    }
    // Impossible siutation but....who knows with C++ enums
    throw badInt((int) f);
}

DirectionReferenceCodeMod::DirectionReferenceCode CDirectionReferenceCode::newDirectionReferenceCode(const std::string& name) {
		
    if (name == CDirectionReferenceCode::sJ2000) {
        return DirectionReferenceCodeMod::J2000;
    }
    	
    if (name == CDirectionReferenceCode::sJMEAN) {
        return DirectionReferenceCodeMod::JMEAN;
    }
    	
    if (name == CDirectionReferenceCode::sJTRUE) {
        return DirectionReferenceCodeMod::JTRUE;
    }
    	
    if (name == CDirectionReferenceCode::sAPP) {
        return DirectionReferenceCodeMod::APP;
    }
    	
    if (name == CDirectionReferenceCode::sB1950) {
        return DirectionReferenceCodeMod::B1950;
    }
    	
    if (name == CDirectionReferenceCode::sB1950_VLA) {
        return DirectionReferenceCodeMod::B1950_VLA;
    }
    	
    if (name == CDirectionReferenceCode::sBMEAN) {
        return DirectionReferenceCodeMod::BMEAN;
    }
    	
    if (name == CDirectionReferenceCode::sBTRUE) {
        return DirectionReferenceCodeMod::BTRUE;
    }
    	
    if (name == CDirectionReferenceCode::sGALACTIC) {
        return DirectionReferenceCodeMod::GALACTIC;
    }
    	
    if (name == CDirectionReferenceCode::sHADEC) {
        return DirectionReferenceCodeMod::HADEC;
    }
    	
    if (name == CDirectionReferenceCode::sAZELSW) {
        return DirectionReferenceCodeMod::AZELSW;
    }
    	
    if (name == CDirectionReferenceCode::sAZELSWGEO) {
        return DirectionReferenceCodeMod::AZELSWGEO;
    }
    	
    if (name == CDirectionReferenceCode::sAZELNE) {
        return DirectionReferenceCodeMod::AZELNE;
    }
    	
    if (name == CDirectionReferenceCode::sAZELNEGEO) {
        return DirectionReferenceCodeMod::AZELNEGEO;
    }
    	
    if (name == CDirectionReferenceCode::sJNAT) {
        return DirectionReferenceCodeMod::JNAT;
    }
    	
    if (name == CDirectionReferenceCode::sECLIPTIC) {
        return DirectionReferenceCodeMod::ECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sMECLIPTIC) {
        return DirectionReferenceCodeMod::MECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sTECLIPTIC) {
        return DirectionReferenceCodeMod::TECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sSUPERGAL) {
        return DirectionReferenceCodeMod::SUPERGAL;
    }
    	
    if (name == CDirectionReferenceCode::sITRF) {
        return DirectionReferenceCodeMod::ITRF;
    }
    	
    if (name == CDirectionReferenceCode::sTOPO) {
        return DirectionReferenceCodeMod::TOPO;
    }
    	
    if (name == CDirectionReferenceCode::sICRS) {
        return DirectionReferenceCodeMod::ICRS;
    }
    	
    if (name == CDirectionReferenceCode::sMERCURY) {
        return DirectionReferenceCodeMod::MERCURY;
    }
    	
    if (name == CDirectionReferenceCode::sVENUS) {
        return DirectionReferenceCodeMod::VENUS;
    }
    	
    if (name == CDirectionReferenceCode::sMARS) {
        return DirectionReferenceCodeMod::MARS;
    }
    	
    if (name == CDirectionReferenceCode::sJUPITER) {
        return DirectionReferenceCodeMod::JUPITER;
    }
    	
    if (name == CDirectionReferenceCode::sSATURN) {
        return DirectionReferenceCodeMod::SATURN;
    }
    	
    if (name == CDirectionReferenceCode::sURANUS) {
        return DirectionReferenceCodeMod::URANUS;
    }
    	
    if (name == CDirectionReferenceCode::sNEPTUNE) {
        return DirectionReferenceCodeMod::NEPTUNE;
    }
    	
    if (name == CDirectionReferenceCode::sPLUTO) {
        return DirectionReferenceCodeMod::PLUTO;
    }
    	
    if (name == CDirectionReferenceCode::sSUN) {
        return DirectionReferenceCodeMod::SUN;
    }
    	
    if (name == CDirectionReferenceCode::sMOON) {
        return DirectionReferenceCodeMod::MOON;
    }
    
    throw badString(name);
}

DirectionReferenceCodeMod::DirectionReferenceCode CDirectionReferenceCode::literal(const std::string& name) {
		
    if (name == CDirectionReferenceCode::sJ2000) {
        return DirectionReferenceCodeMod::J2000;
    }
    	
    if (name == CDirectionReferenceCode::sJMEAN) {
        return DirectionReferenceCodeMod::JMEAN;
    }
    	
    if (name == CDirectionReferenceCode::sJTRUE) {
        return DirectionReferenceCodeMod::JTRUE;
    }
    	
    if (name == CDirectionReferenceCode::sAPP) {
        return DirectionReferenceCodeMod::APP;
    }
    	
    if (name == CDirectionReferenceCode::sB1950) {
        return DirectionReferenceCodeMod::B1950;
    }
    	
    if (name == CDirectionReferenceCode::sB1950_VLA) {
        return DirectionReferenceCodeMod::B1950_VLA;
    }
    	
    if (name == CDirectionReferenceCode::sBMEAN) {
        return DirectionReferenceCodeMod::BMEAN;
    }
    	
    if (name == CDirectionReferenceCode::sBTRUE) {
        return DirectionReferenceCodeMod::BTRUE;
    }
    	
    if (name == CDirectionReferenceCode::sGALACTIC) {
        return DirectionReferenceCodeMod::GALACTIC;
    }
    	
    if (name == CDirectionReferenceCode::sHADEC) {
        return DirectionReferenceCodeMod::HADEC;
    }
    	
    if (name == CDirectionReferenceCode::sAZELSW) {
        return DirectionReferenceCodeMod::AZELSW;
    }
    	
    if (name == CDirectionReferenceCode::sAZELSWGEO) {
        return DirectionReferenceCodeMod::AZELSWGEO;
    }
    	
    if (name == CDirectionReferenceCode::sAZELNE) {
        return DirectionReferenceCodeMod::AZELNE;
    }
    	
    if (name == CDirectionReferenceCode::sAZELNEGEO) {
        return DirectionReferenceCodeMod::AZELNEGEO;
    }
    	
    if (name == CDirectionReferenceCode::sJNAT) {
        return DirectionReferenceCodeMod::JNAT;
    }
    	
    if (name == CDirectionReferenceCode::sECLIPTIC) {
        return DirectionReferenceCodeMod::ECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sMECLIPTIC) {
        return DirectionReferenceCodeMod::MECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sTECLIPTIC) {
        return DirectionReferenceCodeMod::TECLIPTIC;
    }
    	
    if (name == CDirectionReferenceCode::sSUPERGAL) {
        return DirectionReferenceCodeMod::SUPERGAL;
    }
    	
    if (name == CDirectionReferenceCode::sITRF) {
        return DirectionReferenceCodeMod::ITRF;
    }
    	
    if (name == CDirectionReferenceCode::sTOPO) {
        return DirectionReferenceCodeMod::TOPO;
    }
    	
    if (name == CDirectionReferenceCode::sICRS) {
        return DirectionReferenceCodeMod::ICRS;
    }
    	
    if (name == CDirectionReferenceCode::sMERCURY) {
        return DirectionReferenceCodeMod::MERCURY;
    }
    	
    if (name == CDirectionReferenceCode::sVENUS) {
        return DirectionReferenceCodeMod::VENUS;
    }
    	
    if (name == CDirectionReferenceCode::sMARS) {
        return DirectionReferenceCodeMod::MARS;
    }
    	
    if (name == CDirectionReferenceCode::sJUPITER) {
        return DirectionReferenceCodeMod::JUPITER;
    }
    	
    if (name == CDirectionReferenceCode::sSATURN) {
        return DirectionReferenceCodeMod::SATURN;
    }
    	
    if (name == CDirectionReferenceCode::sURANUS) {
        return DirectionReferenceCodeMod::URANUS;
    }
    	
    if (name == CDirectionReferenceCode::sNEPTUNE) {
        return DirectionReferenceCodeMod::NEPTUNE;
    }
    	
    if (name == CDirectionReferenceCode::sPLUTO) {
        return DirectionReferenceCodeMod::PLUTO;
    }
    	
    if (name == CDirectionReferenceCode::sSUN) {
        return DirectionReferenceCodeMod::SUN;
    }
    	
    if (name == CDirectionReferenceCode::sMOON) {
        return DirectionReferenceCodeMod::MOON;
    }
    
    throw badString(name);
}

DirectionReferenceCodeMod::DirectionReferenceCode CDirectionReferenceCode::from_int(unsigned int i) {
	vector<string> names_ = names();
	if (i >= names_.size()) throw badInt(i);
	return newDirectionReferenceCode(names_.at(i));
}

string CDirectionReferenceCode::badString(const string& name) {
	return "'"+name+"' does not correspond to any literal in the enumeration 'DirectionReferenceCode'.";
}

string CDirectionReferenceCode::badInt(unsigned int i) {
	ostringstream oss ;
	oss << "'" << i << "' is out of range for the enumeration 'DirectionReferenceCode'.";
	return oss.str();
}

namespace DirectionReferenceCodeMod {
	std::ostream & operator << ( std::ostream & out, const DirectionReferenceCode& value) {
		out << CDirectionReferenceCode::name(value);
		return out;
	}

	std::istream & operator >> ( std::istream & in , DirectionReferenceCode& value ) {
		in.clear();
		string s ; 
  		in >> s;
  		try {
    		value = CDirectionReferenceCode::literal(s);
  		}
  		catch (string & m) {
    		in.setstate(ios::failbit);
  		}
  		return in;
  	}
}