/**
 * *******************************************************************************
 *  Copyright (c) 2017 Timing-Architects Embedded Systems GmbH and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *     Generated using Eclipse EMF
 * 
 * *******************************************************************************
 */
package org.eclipse.app4mc.amalthea.generator.configuration.impl;

import org.eclipse.app4mc.amalthea.generator.configuration.*;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.impl.EFactoryImpl;

import org.eclipse.emf.ecore.plugin.EcorePlugin;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class RTMGCFactoryImpl extends EFactoryImpl implements RTMGCFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static RTMGCFactory init() {
		try {
			RTMGCFactory theRTMGCFactory = (RTMGCFactory)EPackage.Registry.INSTANCE.getEFactory(RTMGCPackage.eNS_URI);
			if (theRTMGCFactory != null) {
				return theRTMGCFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new RTMGCFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RTMGCFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case RTMGCPackage.RTMGC: return createRTMGC();
			case RTMGCPackage.GENERATION: return createGeneration();
			case RTMGCPackage.ACTIVATION_PROPERTIES: return createActivationProperties();
			case RTMGCPackage.PERIODIC_ACTIVATION: return createPeriodicActivation();
			case RTMGCPackage.PERIODIC_TRIANGLE_SHIFT: return createPeriodicTriangleShift();
			case RTMGCPackage.TRIANGLE_CLOCK: return createTriangleClock();
			case RTMGCPackage.SPORADIC_ACTIVATION: return createSporadicActivation();
			case RTMGCPackage.RECURRENCE: return createRecurrence();
			case RTMGCPackage.LABEL_PROPERTIES: return createLabelProperties();
			case RTMGCPackage.RUNNABLE_PROPERTIES: return createRunnableProperties();
			case RTMGCPackage.SEMAPHORE_PROPERTIES: return createSemaphoreProperties();
			case RTMGCPackage.SEMAPHORE_ACCESS_PROPERTIES: return createSemaphoreAccessProperties();
			case RTMGCPackage.TASK_PROPERTIES: return createTaskProperties();
			case RTMGCPackage.CALL_GRAPH_PROPERTIES: return createCallGraphProperties();
			case RTMGCPackage.INTEGER_DISTRIBUTION: return createIntegerDistribution();
			case RTMGCPackage.INTEGER_TIME_DISTRIBUTION: return createIntegerTimeDistribution();
			case RTMGCPackage.PERCENTAGE_DISTRIBUTION: return createPercentageDistribution();
			case RTMGCPackage.DOUBLE_DISTRIBUTION: return createDoubleDistribution();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case RTMGCPackage.RECURRENCE_TYPE:
				return createRecurrenceTypeFromString(eDataType, initialValue);
			case RTMGCPackage.RUNTIME_TYPE:
				return createRuntimeTypeFromString(eDataType, initialValue);
			case RTMGCPackage.SEMAPHORE_REQUEST_ORDER:
				return createSemaphoreRequestOrderFromString(eDataType, initialValue);
			case RTMGCPackage.SEMAPHORE_ACCESS_TYPE:
				return createSemaphoreAccessTypeFromString(eDataType, initialValue);
			case RTMGCPackage.SEMAPHORE_TYPE:
				return createSemaphoreTypeFromString(eDataType, initialValue);
			case RTMGCPackage.WAIT_MODES:
				return createWaitModesFromString(eDataType, initialValue);
			case RTMGCPackage.DISTRIBUTION_TYPE:
				return createDistributionTypeFromString(eDataType, initialValue);
			case RTMGCPackage.PROCESS_MAPPING_ALGORITHMS:
				return createProcessMappingAlgorithmsFromString(eDataType, initialValue);
			case RTMGCPackage.PRIORITY_DETERMINATION_ALGORITHM:
				return createPriorityDeterminationAlgorithmFromString(eDataType, initialValue);
			case RTMGCPackage.TIME_UNIT:
				return createTimeUnitFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case RTMGCPackage.RECURRENCE_TYPE:
				return convertRecurrenceTypeToString(eDataType, instanceValue);
			case RTMGCPackage.RUNTIME_TYPE:
				return convertRuntimeTypeToString(eDataType, instanceValue);
			case RTMGCPackage.SEMAPHORE_REQUEST_ORDER:
				return convertSemaphoreRequestOrderToString(eDataType, instanceValue);
			case RTMGCPackage.SEMAPHORE_ACCESS_TYPE:
				return convertSemaphoreAccessTypeToString(eDataType, instanceValue);
			case RTMGCPackage.SEMAPHORE_TYPE:
				return convertSemaphoreTypeToString(eDataType, instanceValue);
			case RTMGCPackage.WAIT_MODES:
				return convertWaitModesToString(eDataType, instanceValue);
			case RTMGCPackage.DISTRIBUTION_TYPE:
				return convertDistributionTypeToString(eDataType, instanceValue);
			case RTMGCPackage.PROCESS_MAPPING_ALGORITHMS:
				return convertProcessMappingAlgorithmsToString(eDataType, instanceValue);
			case RTMGCPackage.PRIORITY_DETERMINATION_ALGORITHM:
				return convertPriorityDeterminationAlgorithmToString(eDataType, instanceValue);
			case RTMGCPackage.TIME_UNIT:
				return convertTimeUnitToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RTMGC createRTMGC() {
		RTMGCImpl rtmgc = new RTMGCImpl();
		return rtmgc;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Generation createGeneration() {
		GenerationImpl generation = new GenerationImpl();
		return generation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ActivationProperties createActivationProperties() {
		ActivationPropertiesImpl activationProperties = new ActivationPropertiesImpl();
		return activationProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PeriodicActivation createPeriodicActivation() {
		PeriodicActivationImpl periodicActivation = new PeriodicActivationImpl();
		return periodicActivation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PeriodicTriangleShift createPeriodicTriangleShift() {
		PeriodicTriangleShiftImpl periodicTriangleShift = new PeriodicTriangleShiftImpl();
		return periodicTriangleShift;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TriangleClock createTriangleClock() {
		TriangleClockImpl triangleClock = new TriangleClockImpl();
		return triangleClock;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SporadicActivation createSporadicActivation() {
		SporadicActivationImpl sporadicActivation = new SporadicActivationImpl();
		return sporadicActivation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Recurrence createRecurrence() {
		RecurrenceImpl recurrence = new RecurrenceImpl();
		return recurrence;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LabelProperties createLabelProperties() {
		LabelPropertiesImpl labelProperties = new LabelPropertiesImpl();
		return labelProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RunnableProperties createRunnableProperties() {
		RunnablePropertiesImpl runnableProperties = new RunnablePropertiesImpl();
		return runnableProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreProperties createSemaphoreProperties() {
		SemaphorePropertiesImpl semaphoreProperties = new SemaphorePropertiesImpl();
		return semaphoreProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreAccessProperties createSemaphoreAccessProperties() {
		SemaphoreAccessPropertiesImpl semaphoreAccessProperties = new SemaphoreAccessPropertiesImpl();
		return semaphoreAccessProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TaskProperties createTaskProperties() {
		TaskPropertiesImpl taskProperties = new TaskPropertiesImpl();
		return taskProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CallGraphProperties createCallGraphProperties() {
		CallGraphPropertiesImpl callGraphProperties = new CallGraphPropertiesImpl();
		return callGraphProperties;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerDistribution createIntegerDistribution() {
		IntegerDistributionImpl integerDistribution = new IntegerDistributionImpl();
		return integerDistribution;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerTimeDistribution createIntegerTimeDistribution() {
		IntegerTimeDistributionImpl integerTimeDistribution = new IntegerTimeDistributionImpl();
		return integerTimeDistribution;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PercentageDistribution createPercentageDistribution() {
		PercentageDistributionImpl percentageDistribution = new PercentageDistributionImpl();
		return percentageDistribution;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DoubleDistribution createDoubleDistribution() {
		DoubleDistributionImpl doubleDistribution = new DoubleDistributionImpl();
		return doubleDistribution;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RecurrenceType createRecurrenceTypeFromString(EDataType eDataType, String initialValue) {
		RecurrenceType result = RecurrenceType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertRecurrenceTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RuntimeType createRuntimeTypeFromString(EDataType eDataType, String initialValue) {
		RuntimeType result = RuntimeType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertRuntimeTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreRequestOrder createSemaphoreRequestOrderFromString(EDataType eDataType, String initialValue) {
		SemaphoreRequestOrder result = SemaphoreRequestOrder.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSemaphoreRequestOrderToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreAccessType createSemaphoreAccessTypeFromString(EDataType eDataType, String initialValue) {
		SemaphoreAccessType result = SemaphoreAccessType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSemaphoreAccessTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreType createSemaphoreTypeFromString(EDataType eDataType, String initialValue) {
		SemaphoreType result = SemaphoreType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSemaphoreTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public WaitModes createWaitModesFromString(EDataType eDataType, String initialValue) {
		WaitModes result = WaitModes.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertWaitModesToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DistributionType createDistributionTypeFromString(EDataType eDataType, String initialValue) {
		DistributionType result = DistributionType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertDistributionTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ProcessMappingAlgorithms createProcessMappingAlgorithmsFromString(EDataType eDataType, String initialValue) {
		ProcessMappingAlgorithms result = ProcessMappingAlgorithms.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertProcessMappingAlgorithmsToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PriorityDeterminationAlgorithm createPriorityDeterminationAlgorithmFromString(EDataType eDataType, String initialValue) {
		PriorityDeterminationAlgorithm result = PriorityDeterminationAlgorithm.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertPriorityDeterminationAlgorithmToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TimeUnit createTimeUnitFromString(EDataType eDataType, String initialValue) {
		TimeUnit result = TimeUnit.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTimeUnitToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RTMGCPackage getRTMGCPackage() {
		return (RTMGCPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static RTMGCPackage getPackage() {
		return RTMGCPackage.eINSTANCE;
	}

} //RTMGCFactoryImpl
