/**
 */
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 Eclipse Platform Version</b></em>',
 * and utility methods for working with them.
 * <!-- end-user-doc -->
 * <!-- begin-model-doc -->
 * @since 2.14
 * <!-- end-model-doc -->
 * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenEclipsePlatformVersion()
 * @model
 * @generated
 */
public enum GenEclipsePlatformVersion implements Enumerator
{
  /**
   * The '<em><b>Juno</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #JUNO_VALUE
   * @generated
   * @ordered
   */
  JUNO(0, "Juno", "Juno"),

  /**
   * The '<em><b>Kepler</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #KEPLER_VALUE
   * @generated
   * @ordered
   */
  KEPLER(1, "Kepler", "Kepler"),

  /**
   * The '<em><b>Luna</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #LUNA_VALUE
   * @generated
   * @ordered
   */
  LUNA(2, "Luna", "Luna"),

  /**
   * The '<em><b>Mars</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #MARS_VALUE
   * @generated
   * @ordered
   */
  MARS(3, "Mars", "Mars"),

  /**
   * The '<em><b>Neon</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #NEON_VALUE
   * @generated
   * @ordered
   */
  NEON(4, "Neon", "Neon"),

  /**
   * The '<em><b>Oxygen</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #OXYGEN_VALUE
   * @generated
   * @ordered
   */
  OXYGEN(5, "Oxygen", "Oxygen"),

  /**
   * The '<em><b>Photon</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #PHOTON_VALUE
   * @generated
   * @ordered
   */
  PHOTON(6, "Photon", "Photon"),

  /**
   * The '<em><b>Eclipse 2018 09</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2018_09_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2018_09(7, "Eclipse_2018_09", "2018-09"),

  /**
   * The '<em><b>Eclipse 2018 12</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2018_12_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2018_12(8, "Eclipse_2018_12", "2018-12"),

  /**
   * The '<em><b>Eclipse 2019 03</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.17
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_03_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2019_03(9, "Eclipse_2019_03", "2019-03"),

  /**
   * The '<em><b>Eclipse 2019 06</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.18
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_06_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2019_06(10, "Eclipse_2019_06", "2019-06"),

  /**
   * The '<em><b>Eclipse 2019 09</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.19
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_09_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2019_09(11, "Eclipse_2019_09", "2019-09"),

  /**
   * The '<em><b>Eclipse 2019 12</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.20
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_12_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2019_12(12, "Eclipse_2019_12", "2019-12"),

  /**
   * The '<em><b>Eclipse 2020 03</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.21
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_03_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2020_03(13, "Eclipse_2020_03", "2020-03"),

  /**
   * The '<em><b>Eclipse 2020 06</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.22
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_06_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2020_06(14, "Eclipse_2020_06", "2020-06"),

  /**
   * The '<em><b>Eclipse 2020 09</b></em>' literal object.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.23
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_09_VALUE
   * @generated
   * @ordered
   */
  ECLIPSE_2020_09(15, "Eclipse_2020_09", "2020-09");

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

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

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

  /**
   * The '<em><b>Mars</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #MARS
   * @model name="Mars"
   * @generated
   * @ordered
   */
  public static final int MARS_VALUE = 3;

  /**
   * The '<em><b>Neon</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #NEON
   * @model name="Neon"
   * @generated
   * @ordered
   */
  public static final int NEON_VALUE = 4;

  /**
   * The '<em><b>Oxygen</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #OXYGEN
   * @model name="Oxygen"
   * @generated
   * @ordered
   */
  public static final int OXYGEN_VALUE = 5;

  /**
   * The '<em><b>Photon</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #PHOTON
   * @model name="Photon"
   * @generated
   * @ordered
   */
  public static final int PHOTON_VALUE = 6;

  /**
   * The '<em><b>Eclipse 2018 09</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2018_09
   * @model name="Eclipse_2018_09" literal="2018-09"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2018_09_VALUE = 7;

  /**
   * The '<em><b>Eclipse 2018 12</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.16
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2018_12
   * @model name="Eclipse_2018_12" literal="2018-12"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2018_12_VALUE = 8;

  /**
   * The '<em><b>Eclipse 2019 03</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.17
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_03
   * @model name="Eclipse_2019_03" literal="2019-03"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2019_03_VALUE = 9;

  /**
   * The '<em><b>Eclipse 2019 06</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.18
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_06
   * @model name="Eclipse_2019_06" literal="2019-06"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2019_06_VALUE = 10;

  /**
   * The '<em><b>Eclipse 2019 09</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.19
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_09
   * @model name="Eclipse_2019_09" literal="2019-09"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2019_09_VALUE = 11;

  /**
   * The '<em><b>Eclipse 2019 12</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.20
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2019_12
   * @model name="Eclipse_2019_12" literal="2019-12"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2019_12_VALUE = 12;

  /**
   * The '<em><b>Eclipse 2020 03</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.21
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_03
   * @model name="Eclipse_2020_03" literal="2020-03"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2020_03_VALUE = 13;

  /**
   * The '<em><b>Eclipse 2020 06</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.22
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_06
   * @model name="Eclipse_2020_06" literal="2020-06"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2020_06_VALUE = 14;

  /**
   * The '<em><b>Eclipse 2020 09</b></em>' literal value.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.23
   * <!-- end-model-doc -->
   * @see #ECLIPSE_2020_09
   * @model name="Eclipse_2020_09" literal="2020-09"
   * @generated
   * @ordered
   */
  public static final int ECLIPSE_2020_09_VALUE = 15;

  /**
   * An array of all the '<em><b>Gen Eclipse Platform Version</b></em>' enumerators.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  private static final GenEclipsePlatformVersion[] VALUES_ARRAY =
    new GenEclipsePlatformVersion[]
    {
      JUNO,
      KEPLER,
      LUNA,
      MARS,
      NEON,
      OXYGEN,
      PHOTON,
      ECLIPSE_2018_09,
      ECLIPSE_2018_12,
      ECLIPSE_2019_03,
      ECLIPSE_2019_06,
      ECLIPSE_2019_09,
      ECLIPSE_2019_12,
      ECLIPSE_2020_03,
      ECLIPSE_2020_06,
      ECLIPSE_2020_09,
    };

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

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

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

  /**
   * Returns the '<em><b>Gen Eclipse Platform 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 GenEclipsePlatformVersion get(int value)
  {
    switch (value)
    {
      case JUNO_VALUE: return JUNO;
      case KEPLER_VALUE: return KEPLER;
      case LUNA_VALUE: return LUNA;
      case MARS_VALUE: return MARS;
      case NEON_VALUE: return NEON;
      case OXYGEN_VALUE: return OXYGEN;
      case PHOTON_VALUE: return PHOTON;
      case ECLIPSE_2018_09_VALUE: return ECLIPSE_2018_09;
      case ECLIPSE_2018_12_VALUE: return ECLIPSE_2018_12;
      case ECLIPSE_2019_03_VALUE: return ECLIPSE_2019_03;
      case ECLIPSE_2019_06_VALUE: return ECLIPSE_2019_06;
      case ECLIPSE_2019_09_VALUE: return ECLIPSE_2019_09;
      case ECLIPSE_2019_12_VALUE: return ECLIPSE_2019_12;
      case ECLIPSE_2020_03_VALUE: return ECLIPSE_2020_03;
      case ECLIPSE_2020_06_VALUE: return ECLIPSE_2020_06;
      case ECLIPSE_2020_09_VALUE: return ECLIPSE_2020_09;
    }
    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 GenEclipsePlatformVersion(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;
  }

} //GenEclipsePlatformVersion
