/**
 */
package org.hl7.fhir;

import java.lang.String;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.eclipse.emf.common.util.Enumerator;

/**
 * <!-- begin-user-doc -->
 * A representation of the literals of the enumeration '<em><b>FHIR Version List</b></em>',
 * and utility methods for working with them.
 * <!-- end-user-doc -->
 * @see org.hl7.fhir.FhirPackage#getFHIRVersionList()
 * @model extendedMetaData="name='FHIRVersion-list'"
 * @generated
 */
public enum FHIRVersionList implements Enumerator {
	/**
	 * The '<em><b>001</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_001_VALUE
	 * @generated
	 * @ordered
	 */
	_001(0, "_001", "0.01"),

	/**
	 * The '<em><b>005</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_005_VALUE
	 * @generated
	 * @ordered
	 */
	_005(1, "_005", "0.05"),

	/**
	 * The '<em><b>006</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_006_VALUE
	 * @generated
	 * @ordered
	 */
	_006(2, "_006", "0.06"),

	/**
	 * The '<em><b>011</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_011_VALUE
	 * @generated
	 * @ordered
	 */
	_011(3, "_011", "0.11"),

	/**
	 * The '<em><b>0080</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_0080_VALUE
	 * @generated
	 * @ordered
	 */
	_0080(4, "_0080", "0.0.80"),

	/**
	 * The '<em><b>0081</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_0081_VALUE
	 * @generated
	 * @ordered
	 */
	_0081(5, "_0081", "0.0.81"),

	/**
	 * The '<em><b>0082</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_0082_VALUE
	 * @generated
	 * @ordered
	 */
	_0082(6, "_0082", "0.0.82"),

	/**
	 * The '<em><b>040</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_040_VALUE
	 * @generated
	 * @ordered
	 */
	_040(7, "_040", "0.4.0"),

	/**
	 * The '<em><b>050</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_050_VALUE
	 * @generated
	 * @ordered
	 */
	_050(8, "_050", "0.5.0"),

	/**
	 * The '<em><b>100</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_100_VALUE
	 * @generated
	 * @ordered
	 */
	_100(9, "_100", "1.0.0"),

	/**
	 * The '<em><b>101</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_101_VALUE
	 * @generated
	 * @ordered
	 */
	_101(10, "_101", "1.0.1"),

	/**
	 * The '<em><b>102</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_102_VALUE
	 * @generated
	 * @ordered
	 */
	_102(11, "_102", "1.0.2"),

	/**
	 * The '<em><b>110</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_110_VALUE
	 * @generated
	 * @ordered
	 */
	_110(12, "_110", "1.1.0"),

	/**
	 * The '<em><b>140</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_140_VALUE
	 * @generated
	 * @ordered
	 */
	_140(13, "_140", "1.4.0"),

	/**
	 * The '<em><b>160</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_160_VALUE
	 * @generated
	 * @ordered
	 */
	_160(14, "_160", "1.6.0"),

	/**
	 * The '<em><b>180</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_180_VALUE
	 * @generated
	 * @ordered
	 */
	_180(15, "_180", "1.8.0"),

	/**
	 * The '<em><b>300</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_300_VALUE
	 * @generated
	 * @ordered
	 */
	_300(16, "_300", "3.0.0"),

	/**
	 * The '<em><b>301</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_301_VALUE
	 * @generated
	 * @ordered
	 */
	_301(17, "_301", "3.0.1"),

	/**
	 * The '<em><b>330</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_330_VALUE
	 * @generated
	 * @ordered
	 */
	_330(18, "_330", "3.3.0"),

	/**
	 * The '<em><b>350</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_350_VALUE
	 * @generated
	 * @ordered
	 */
	_350(19, "_350", "3.5.0"),

	/**
	 * The '<em><b>400</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #_400_VALUE
	 * @generated
	 * @ordered
	 */
	_400(20, "_400", "4.0.0");

	/**
	 * The '<em><b>001</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.01
	 * <!-- end-model-doc -->
	 * @see #_001
	 * @model literal="0.01"
	 * @generated
	 * @ordered
	 */
	public static final int _001_VALUE = 0;

	/**
	 * The '<em><b>005</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.05
	 * <!-- end-model-doc -->
	 * @see #_005
	 * @model literal="0.05"
	 * @generated
	 * @ordered
	 */
	public static final int _005_VALUE = 1;

	/**
	 * The '<em><b>006</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.06
	 * <!-- end-model-doc -->
	 * @see #_006
	 * @model literal="0.06"
	 * @generated
	 * @ordered
	 */
	public static final int _006_VALUE = 2;

	/**
	 * The '<em><b>011</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.11
	 * <!-- end-model-doc -->
	 * @see #_011
	 * @model literal="0.11"
	 * @generated
	 * @ordered
	 */
	public static final int _011_VALUE = 3;

	/**
	 * The '<em><b>0080</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.0.80
	 * <!-- end-model-doc -->
	 * @see #_0080
	 * @model literal="0.0.80"
	 * @generated
	 * @ordered
	 */
	public static final int _0080_VALUE = 4;

	/**
	 * The '<em><b>0081</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.0.81
	 * <!-- end-model-doc -->
	 * @see #_0081
	 * @model literal="0.0.81"
	 * @generated
	 * @ordered
	 */
	public static final int _0081_VALUE = 5;

	/**
	 * The '<em><b>0082</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.0.82
	 * <!-- end-model-doc -->
	 * @see #_0082
	 * @model literal="0.0.82"
	 * @generated
	 * @ordered
	 */
	public static final int _0082_VALUE = 6;

	/**
	 * The '<em><b>040</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.4.0
	 * <!-- end-model-doc -->
	 * @see #_040
	 * @model literal="0.4.0"
	 * @generated
	 * @ordered
	 */
	public static final int _040_VALUE = 7;

	/**
	 * The '<em><b>050</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 0.5.0
	 * <!-- end-model-doc -->
	 * @see #_050
	 * @model literal="0.5.0"
	 * @generated
	 * @ordered
	 */
	public static final int _050_VALUE = 8;

	/**
	 * The '<em><b>100</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.0.0
	 * <!-- end-model-doc -->
	 * @see #_100
	 * @model literal="1.0.0"
	 * @generated
	 * @ordered
	 */
	public static final int _100_VALUE = 9;

	/**
	 * The '<em><b>101</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.0.1
	 * <!-- end-model-doc -->
	 * @see #_101
	 * @model literal="1.0.1"
	 * @generated
	 * @ordered
	 */
	public static final int _101_VALUE = 10;

	/**
	 * The '<em><b>102</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.0.2
	 * <!-- end-model-doc -->
	 * @see #_102
	 * @model literal="1.0.2"
	 * @generated
	 * @ordered
	 */
	public static final int _102_VALUE = 11;

	/**
	 * The '<em><b>110</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.1.0
	 * <!-- end-model-doc -->
	 * @see #_110
	 * @model literal="1.1.0"
	 * @generated
	 * @ordered
	 */
	public static final int _110_VALUE = 12;

	/**
	 * The '<em><b>140</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.4.0
	 * <!-- end-model-doc -->
	 * @see #_140
	 * @model literal="1.4.0"
	 * @generated
	 * @ordered
	 */
	public static final int _140_VALUE = 13;

	/**
	 * The '<em><b>160</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.6.0
	 * <!-- end-model-doc -->
	 * @see #_160
	 * @model literal="1.6.0"
	 * @generated
	 * @ordered
	 */
	public static final int _160_VALUE = 14;

	/**
	 * The '<em><b>180</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 1.8.0
	 * <!-- end-model-doc -->
	 * @see #_180
	 * @model literal="1.8.0"
	 * @generated
	 * @ordered
	 */
	public static final int _180_VALUE = 15;

	/**
	 * The '<em><b>300</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 3.0.0
	 * <!-- end-model-doc -->
	 * @see #_300
	 * @model literal="3.0.0"
	 * @generated
	 * @ordered
	 */
	public static final int _300_VALUE = 16;

	/**
	 * The '<em><b>301</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 3.0.1
	 * <!-- end-model-doc -->
	 * @see #_301
	 * @model literal="3.0.1"
	 * @generated
	 * @ordered
	 */
	public static final int _301_VALUE = 17;

	/**
	 * The '<em><b>330</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 3.3.0
	 * <!-- end-model-doc -->
	 * @see #_330
	 * @model literal="3.3.0"
	 * @generated
	 * @ordered
	 */
	public static final int _330_VALUE = 18;

	/**
	 * The '<em><b>350</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 3.5.0
	 * <!-- end-model-doc -->
	 * @see #_350
	 * @model literal="3.5.0"
	 * @generated
	 * @ordered
	 */
	public static final int _350_VALUE = 19;

	/**
	 * The '<em><b>400</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * 4.0.0
	 * <!-- end-model-doc -->
	 * @see #_400
	 * @model literal="4.0.0"
	 * @generated
	 * @ordered
	 */
	public static final int _400_VALUE = 20;

	/**
	 * An array of all the '<em><b>FHIR Version List</b></em>' enumerators.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static final FHIRVersionList[] VALUES_ARRAY =
		new FHIRVersionList[] {
			_001,
			_005,
			_006,
			_011,
			_0080,
			_0081,
			_0082,
			_040,
			_050,
			_100,
			_101,
			_102,
			_110,
			_140,
			_160,
			_180,
			_300,
			_301,
			_330,
			_350,
			_400,
		};

	/**
	 * A public read-only list of all the '<em><b>FHIR Version List</b></em>' enumerators.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static final List<FHIRVersionList> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));

	/**
	 * Returns the '<em><b>FHIR Version List</b></em>' literal with the specified literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param literal the literal.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static FHIRVersionList get(String literal) {
		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
			FHIRVersionList result = VALUES_ARRAY[i];
			if (result.toString().equals(literal)) {
				return result;
			}
		}
		return null;
	}

	/**
	 * Returns the '<em><b>FHIR Version List</b></em>' literal with the specified name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param name the name.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static FHIRVersionList getByName(String name) {
		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
			FHIRVersionList result = VALUES_ARRAY[i];
			if (result.getName().equals(name)) {
				return result;
			}
		}
		return null;
	}

	/**
	 * Returns the '<em><b>FHIR Version List</b></em>' literal with the specified integer value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the integer value.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static FHIRVersionList get(int value) {
		switch (value) {
			case _001_VALUE: return _001;
			case _005_VALUE: return _005;
			case _006_VALUE: return _006;
			case _011_VALUE: return _011;
			case _0080_VALUE: return _0080;
			case _0081_VALUE: return _0081;
			case _0082_VALUE: return _0082;
			case _040_VALUE: return _040;
			case _050_VALUE: return _050;
			case _100_VALUE: return _100;
			case _101_VALUE: return _101;
			case _102_VALUE: return _102;
			case _110_VALUE: return _110;
			case _140_VALUE: return _140;
			case _160_VALUE: return _160;
			case _180_VALUE: return _180;
			case _300_VALUE: return _300;
			case _301_VALUE: return _301;
			case _330_VALUE: return _330;
			case _350_VALUE: return _350;
			case _400_VALUE: return _400;
		}
		return null;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final int value;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final String name;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final String literal;

	/**
	 * Only this class can construct instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private FHIRVersionList(int value, String name, String literal) {
		this.value = value;
		this.name = name;
		this.literal = literal;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public int getValue() {
	  return value;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getName() {
	  return name;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getLiteral() {
	  return literal;
	}

	/**
	 * Returns the literal value of the enumerator, which is its string representation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		return literal;
	}
	
} //FHIRVersionList
