/**
 * Copyright (c) 2008-2009 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 */
package org.eclipse.emf.codegen.ecore.genmodel;

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>Gen Runtime Version</b></em>',
 * and utility methods for working with them.
 * @since 2.4
 * <!-- end-user-doc -->
 * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenRuntimeVersion()
 * @model
 * @generated
 */
public enum GenRuntimeVersion implements Enumerator
{
  /**
   * The '<em><b>EMF22</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF22_VALUE
   * @generated
   * @ordered
   */
  EMF22(0, "EMF22", "2.2"), /**
   * The '<em><b>EMF23</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF23_VALUE
   * @generated
   * @ordered
   */
  EMF23(1, "EMF23", "2.3"), /**
   * The '<em><b>EMF24</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF24_VALUE
   * @generated
   * @ordered
   */
  EMF24(2, "EMF24", "2.4"), /**
   * The '<em><b>EMF25</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF25_VALUE
   * @generated
   * @ordered
   */
  EMF25(3, "EMF25", "2.5"), /**
   * The '<em><b>EMF26</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF26_VALUE
   * @generated
   * @ordered
   */
  EMF26(4, "EMF26", "2.6"), /**
   * The '<em><b>EMF27</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF27_VALUE
   * @generated
   * @ordered
   */
  EMF27(5, "EMF27", "2.7"), /**
   * The '<em><b>EMF28</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF28_VALUE
   * @generated
   * @ordered
   */
  EMF28(6, "EMF28", "2.8"), /**
   * The '<em><b>EMF29</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF29_VALUE
   * @generated
   * @ordered
   */
  EMF29(7, "EMF29", "2.9"), /**
   * The '<em><b>EMF210</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF210_VALUE
   * @generated
   * @ordered
   */
  EMF210(8, "EMF210", "2.10"), /**
   * The '<em><b>EMF211</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF211_VALUE
   * @generated
   * @ordered
   */
  EMF211(9, "EMF211", "2.11"), /**
   * The '<em><b>EMF212</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF212_VALUE
   * @generated
   * @ordered
   */
  EMF212(10, "EMF212", "2.12"), 

  /**
   * The '<em><b>EMF213</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #EMF213_VALUE
   * @generated
   * @ordered
   */
  EMF213(11, "EMF213", "2.13"), /**
   * The '<em><b>EMF214</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.14
   * <!-- end-model-doc -->
   * @see #EMF214_VALUE
   * @generated
   * @ordered
   */
  EMF214(12, "EMF214", "2.14"), /**
   * The '<em><b>EMF215</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #EMF215_VALUE
   * @generated
   * @ordered
   */
  EMF215(13, "EMF215", "2.15"), /**
   * The '<em><b>EMF216</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #EMF216_VALUE
   * @generated
   * @ordered
   */
  EMF216(14, "EMF216", "2.16"), /**
   * The '<em><b>EMF217</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.17
   * <!-- end-model-doc -->
   * @see #EMF217_VALUE
   * @generated
   * @ordered
   */
  EMF217(15, "EMF217", "2.17");

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

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

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

  /**
   * The '<em><b>EMF25</b></em>' literal value.
   * <!-- begin-user-doc -->
   * @since 2.5
   * <!-- end-user-doc -->
   * @see #EMF25
   * @model literal="2.5"
   * @generated
   * @ordered
   */
  public static final int EMF25_VALUE = 3;

  /**
   * The '<em><b>EMF26</b></em>' literal value.
   * <!-- begin-user-doc -->
   * @since 2.6
   * <!-- end-user-doc -->
   * @see #EMF26
   * @model literal="2.6"
   * @generated
   * @ordered
   */
  public static final int EMF26_VALUE = 4;

  /**
   * The '<em><b>EMF27</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.7
   * </p>
   * <!-- end-user-doc -->
   * @see #EMF27
   * @model literal="2.7"
   * @generated
   * @ordered
   */
  public static final int EMF27_VALUE = 5;

  /**
   * The '<em><b>EMF28</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.8
   * </p>
   * <!-- end-user-doc -->
   * @see #EMF28
   * @model literal="2.8"
   * @generated
   * @ordered
   */
  public static final int EMF28_VALUE = 6;

  /**
   * The '<em><b>EMF29</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.9
   * </p>
   * <!-- end-user-doc -->
   * @see #EMF29
   * @model literal="2.9"
   * @generated
   * @ordered
   */
  public static final int EMF29_VALUE = 7;

  /**
   * The '<em><b>EMF210</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.10
   * </p>
   * <!-- end-user-doc -->
   * @see #EMF210
   * @model literal="2.10"
   * @generated
   * @ordered
   */
  public static final int EMF210_VALUE = 8;

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

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

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

  /**
   * The '<em><b>EMF214</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.14
   * <!-- end-model-doc -->
   * @see #EMF214
   * @model literal="2.14"
   * @generated
   * @ordered
   */
  public static final int EMF214_VALUE = 12;

  /**
   * The '<em><b>EMF215</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #EMF215
   * @model literal="2.15"
   * @generated
   * @ordered
   */
  public static final int EMF215_VALUE = 13;

  /**
   * The '<em><b>EMF216</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #EMF216
   * @model literal="2.16"
   * @generated
   * @ordered
   */
  public static final int EMF216_VALUE = 14;

  /**
   * The '<em><b>EMF217</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.17
   * <!-- end-model-doc -->
   * @see #EMF217
   * @model literal="2.17"
   * @generated
   * @ordered
   */
  public static final int EMF217_VALUE = 15;

  /**
   * An array of all the '<em><b>Gen Runtime Version</b></em>' enumerators.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  private static final GenRuntimeVersion[] VALUES_ARRAY =
    new GenRuntimeVersion[]
    {
      EMF22,
      EMF23,
      EMF24,
      EMF25,
      EMF26,
      EMF27,
      EMF28,
      EMF29,
      EMF210,
      EMF211,
      EMF212,
      EMF213,
      EMF214,
      EMF215,
      EMF216,
      EMF217,
    };

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

  /**
   * Returns the '<em><b>Gen Runtime Version</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 GenRuntimeVersion get(String literal)
  {
    for (int i = 0; i < VALUES_ARRAY.length; ++i)
    {
      GenRuntimeVersion result = VALUES_ARRAY[i];
      if (result.toString().equals(literal))
      {
        return result;
      }
    }
    return null;
  }

  /**
   * Returns the '<em><b>Gen Runtime Version</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 GenRuntimeVersion getByName(String name)
  {
    for (int i = 0; i < VALUES_ARRAY.length; ++i)
    {
      GenRuntimeVersion result = VALUES_ARRAY[i];
      if (result.getName().equals(name))
      {
        return result;
      }
    }
    return null;
  }

  /**
   * Returns the '<em><b>Gen Runtime Version</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 GenRuntimeVersion get(int value)
  {
    switch (value)
    {
      case EMF22_VALUE: return EMF22;
      case EMF23_VALUE: return EMF23;
      case EMF24_VALUE: return EMF24;
      case EMF25_VALUE: return EMF25;
      case EMF26_VALUE: return EMF26;
      case EMF27_VALUE: return EMF27;
      case EMF28_VALUE: return EMF28;
      case EMF29_VALUE: return EMF29;
      case EMF210_VALUE: return EMF210;
      case EMF211_VALUE: return EMF211;
      case EMF212_VALUE: return EMF212;
      case EMF213_VALUE: return EMF213;
      case EMF214_VALUE: return EMF214;
      case EMF215_VALUE: return EMF215;
      case EMF216_VALUE: return EMF216;
      case EMF217_VALUE: return EMF217;
    }
    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 GenRuntimeVersion(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;
  }
  
} //GenRuntimeVersion
