/**
 * *******************************************************************************
 *  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.CallGraphProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm;
import org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms;
import org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage;
import org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Task Properties</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getCount <em>Count</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getLoad <em>Load</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getPerTaskGroup <em>Per Task Group</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getMta <em>Mta</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getDeadlineFactor <em>Deadline Factor</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getCallSequencesBetweenSchedulePoints <em>Call Sequences Between Schedule Points</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getCallGraphs <em>Call Graphs</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getMappingDetermination <em>Mapping Determination</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl#getPriorityDetermination <em>Priority Determination</em>}</li>
 * </ul>
 *
 * @generated
 */
public class TaskPropertiesImpl extends MinimalEObjectImpl.Container implements TaskProperties {
	/**
	 * The cached value of the '{@link #getCount() <em>Count</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCount()
	 * @generated
	 * @ordered
	 */
	protected IntegerDistribution count;

	/**
	 * The cached value of the '{@link #getLoad() <em>Load</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLoad()
	 * @generated
	 * @ordered
	 */
	protected PercentageDistribution load;

	/**
	 * The cached value of the '{@link #getPerTaskGroup() <em>Per Task Group</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPerTaskGroup()
	 * @generated
	 * @ordered
	 */
	protected IntegerDistribution perTaskGroup;

	/**
	 * The cached value of the '{@link #getMta() <em>Mta</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMta()
	 * @generated
	 * @ordered
	 */
	protected IntegerDistribution mta;

	/**
	 * The cached value of the '{@link #getDeadlineFactor() <em>Deadline Factor</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getDeadlineFactor()
	 * @generated
	 * @ordered
	 */
	protected DoubleDistribution deadlineFactor;

	/**
	 * The cached value of the '{@link #getCallSequencesBetweenSchedulePoints() <em>Call Sequences Between Schedule Points</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCallSequencesBetweenSchedulePoints()
	 * @generated
	 * @ordered
	 */
	protected IntegerDistribution callSequencesBetweenSchedulePoints;

	/**
	 * The cached value of the '{@link #getCallGraphs() <em>Call Graphs</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCallGraphs()
	 * @generated
	 * @ordered
	 */
	protected CallGraphProperties callGraphs;

	/**
	 * The default value of the '{@link #getMappingDetermination() <em>Mapping Determination</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMappingDetermination()
	 * @generated
	 * @ordered
	 */
	protected static final ProcessMappingAlgorithms MAPPING_DETERMINATION_EDEFAULT = ProcessMappingAlgorithms.WFD;

	/**
	 * The cached value of the '{@link #getMappingDetermination() <em>Mapping Determination</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMappingDetermination()
	 * @generated
	 * @ordered
	 */
	protected ProcessMappingAlgorithms mappingDetermination = MAPPING_DETERMINATION_EDEFAULT;

	/**
	 * The default value of the '{@link #getPriorityDetermination() <em>Priority Determination</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPriorityDetermination()
	 * @generated
	 * @ordered
	 */
	protected static final PriorityDeterminationAlgorithm PRIORITY_DETERMINATION_EDEFAULT = PriorityDeterminationAlgorithm.RM;

	/**
	 * The cached value of the '{@link #getPriorityDetermination() <em>Priority Determination</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPriorityDetermination()
	 * @generated
	 * @ordered
	 */
	protected PriorityDeterminationAlgorithm priorityDetermination = PRIORITY_DETERMINATION_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected TaskPropertiesImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return RTMGCPackage.Literals.TASK_PROPERTIES;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerDistribution getCount() {
		return count;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetCount(IntegerDistribution newCount, NotificationChain msgs) {
		IntegerDistribution oldCount = count;
		count = newCount;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__COUNT, oldCount, newCount);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCount(IntegerDistribution newCount) {
		if (newCount != count) {
			NotificationChain msgs = null;
			if (count != null)
				msgs = ((InternalEObject)count).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__COUNT, null, msgs);
			if (newCount != null)
				msgs = ((InternalEObject)newCount).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__COUNT, null, msgs);
			msgs = basicSetCount(newCount, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__COUNT, newCount, newCount));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PercentageDistribution getLoad() {
		return load;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetLoad(PercentageDistribution newLoad, NotificationChain msgs) {
		PercentageDistribution oldLoad = load;
		load = newLoad;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__LOAD, oldLoad, newLoad);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLoad(PercentageDistribution newLoad) {
		if (newLoad != load) {
			NotificationChain msgs = null;
			if (load != null)
				msgs = ((InternalEObject)load).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__LOAD, null, msgs);
			if (newLoad != null)
				msgs = ((InternalEObject)newLoad).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__LOAD, null, msgs);
			msgs = basicSetLoad(newLoad, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__LOAD, newLoad, newLoad));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerDistribution getPerTaskGroup() {
		return perTaskGroup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetPerTaskGroup(IntegerDistribution newPerTaskGroup, NotificationChain msgs) {
		IntegerDistribution oldPerTaskGroup = perTaskGroup;
		perTaskGroup = newPerTaskGroup;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP, oldPerTaskGroup, newPerTaskGroup);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setPerTaskGroup(IntegerDistribution newPerTaskGroup) {
		if (newPerTaskGroup != perTaskGroup) {
			NotificationChain msgs = null;
			if (perTaskGroup != null)
				msgs = ((InternalEObject)perTaskGroup).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP, null, msgs);
			if (newPerTaskGroup != null)
				msgs = ((InternalEObject)newPerTaskGroup).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP, null, msgs);
			msgs = basicSetPerTaskGroup(newPerTaskGroup, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP, newPerTaskGroup, newPerTaskGroup));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerDistribution getMta() {
		return mta;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetMta(IntegerDistribution newMta, NotificationChain msgs) {
		IntegerDistribution oldMta = mta;
		mta = newMta;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__MTA, oldMta, newMta);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMta(IntegerDistribution newMta) {
		if (newMta != mta) {
			NotificationChain msgs = null;
			if (mta != null)
				msgs = ((InternalEObject)mta).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__MTA, null, msgs);
			if (newMta != null)
				msgs = ((InternalEObject)newMta).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__MTA, null, msgs);
			msgs = basicSetMta(newMta, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__MTA, newMta, newMta));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DoubleDistribution getDeadlineFactor() {
		return deadlineFactor;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetDeadlineFactor(DoubleDistribution newDeadlineFactor, NotificationChain msgs) {
		DoubleDistribution oldDeadlineFactor = deadlineFactor;
		deadlineFactor = newDeadlineFactor;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR, oldDeadlineFactor, newDeadlineFactor);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setDeadlineFactor(DoubleDistribution newDeadlineFactor) {
		if (newDeadlineFactor != deadlineFactor) {
			NotificationChain msgs = null;
			if (deadlineFactor != null)
				msgs = ((InternalEObject)deadlineFactor).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR, null, msgs);
			if (newDeadlineFactor != null)
				msgs = ((InternalEObject)newDeadlineFactor).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR, null, msgs);
			msgs = basicSetDeadlineFactor(newDeadlineFactor, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR, newDeadlineFactor, newDeadlineFactor));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerDistribution getCallSequencesBetweenSchedulePoints() {
		return callSequencesBetweenSchedulePoints;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetCallSequencesBetweenSchedulePoints(IntegerDistribution newCallSequencesBetweenSchedulePoints, NotificationChain msgs) {
		IntegerDistribution oldCallSequencesBetweenSchedulePoints = callSequencesBetweenSchedulePoints;
		callSequencesBetweenSchedulePoints = newCallSequencesBetweenSchedulePoints;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS, oldCallSequencesBetweenSchedulePoints, newCallSequencesBetweenSchedulePoints);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCallSequencesBetweenSchedulePoints(IntegerDistribution newCallSequencesBetweenSchedulePoints) {
		if (newCallSequencesBetweenSchedulePoints != callSequencesBetweenSchedulePoints) {
			NotificationChain msgs = null;
			if (callSequencesBetweenSchedulePoints != null)
				msgs = ((InternalEObject)callSequencesBetweenSchedulePoints).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS, null, msgs);
			if (newCallSequencesBetweenSchedulePoints != null)
				msgs = ((InternalEObject)newCallSequencesBetweenSchedulePoints).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS, null, msgs);
			msgs = basicSetCallSequencesBetweenSchedulePoints(newCallSequencesBetweenSchedulePoints, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS, newCallSequencesBetweenSchedulePoints, newCallSequencesBetweenSchedulePoints));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CallGraphProperties getCallGraphs() {
		return callGraphs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetCallGraphs(CallGraphProperties newCallGraphs, NotificationChain msgs) {
		CallGraphProperties oldCallGraphs = callGraphs;
		callGraphs = newCallGraphs;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS, oldCallGraphs, newCallGraphs);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCallGraphs(CallGraphProperties newCallGraphs) {
		if (newCallGraphs != callGraphs) {
			NotificationChain msgs = null;
			if (callGraphs != null)
				msgs = ((InternalEObject)callGraphs).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS, null, msgs);
			if (newCallGraphs != null)
				msgs = ((InternalEObject)newCallGraphs).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS, null, msgs);
			msgs = basicSetCallGraphs(newCallGraphs, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS, newCallGraphs, newCallGraphs));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ProcessMappingAlgorithms getMappingDetermination() {
		return mappingDetermination;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMappingDetermination(ProcessMappingAlgorithms newMappingDetermination) {
		ProcessMappingAlgorithms oldMappingDetermination = mappingDetermination;
		mappingDetermination = newMappingDetermination == null ? MAPPING_DETERMINATION_EDEFAULT : newMappingDetermination;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__MAPPING_DETERMINATION, oldMappingDetermination, mappingDetermination));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PriorityDeterminationAlgorithm getPriorityDetermination() {
		return priorityDetermination;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setPriorityDetermination(PriorityDeterminationAlgorithm newPriorityDetermination) {
		PriorityDeterminationAlgorithm oldPriorityDetermination = priorityDetermination;
		priorityDetermination = newPriorityDetermination == null ? PRIORITY_DETERMINATION_EDEFAULT : newPriorityDetermination;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.TASK_PROPERTIES__PRIORITY_DETERMINATION, oldPriorityDetermination, priorityDetermination));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case RTMGCPackage.TASK_PROPERTIES__COUNT:
				return basicSetCount(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__LOAD:
				return basicSetLoad(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP:
				return basicSetPerTaskGroup(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__MTA:
				return basicSetMta(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR:
				return basicSetDeadlineFactor(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS:
				return basicSetCallSequencesBetweenSchedulePoints(null, msgs);
			case RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS:
				return basicSetCallGraphs(null, msgs);
		}
		return super.eInverseRemove(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case RTMGCPackage.TASK_PROPERTIES__COUNT:
				return getCount();
			case RTMGCPackage.TASK_PROPERTIES__LOAD:
				return getLoad();
			case RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP:
				return getPerTaskGroup();
			case RTMGCPackage.TASK_PROPERTIES__MTA:
				return getMta();
			case RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR:
				return getDeadlineFactor();
			case RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS:
				return getCallSequencesBetweenSchedulePoints();
			case RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS:
				return getCallGraphs();
			case RTMGCPackage.TASK_PROPERTIES__MAPPING_DETERMINATION:
				return getMappingDetermination();
			case RTMGCPackage.TASK_PROPERTIES__PRIORITY_DETERMINATION:
				return getPriorityDetermination();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case RTMGCPackage.TASK_PROPERTIES__COUNT:
				setCount((IntegerDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__LOAD:
				setLoad((PercentageDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP:
				setPerTaskGroup((IntegerDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__MTA:
				setMta((IntegerDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR:
				setDeadlineFactor((DoubleDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS:
				setCallSequencesBetweenSchedulePoints((IntegerDistribution)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS:
				setCallGraphs((CallGraphProperties)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__MAPPING_DETERMINATION:
				setMappingDetermination((ProcessMappingAlgorithms)newValue);
				return;
			case RTMGCPackage.TASK_PROPERTIES__PRIORITY_DETERMINATION:
				setPriorityDetermination((PriorityDeterminationAlgorithm)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case RTMGCPackage.TASK_PROPERTIES__COUNT:
				setCount((IntegerDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__LOAD:
				setLoad((PercentageDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP:
				setPerTaskGroup((IntegerDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__MTA:
				setMta((IntegerDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR:
				setDeadlineFactor((DoubleDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS:
				setCallSequencesBetweenSchedulePoints((IntegerDistribution)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS:
				setCallGraphs((CallGraphProperties)null);
				return;
			case RTMGCPackage.TASK_PROPERTIES__MAPPING_DETERMINATION:
				setMappingDetermination(MAPPING_DETERMINATION_EDEFAULT);
				return;
			case RTMGCPackage.TASK_PROPERTIES__PRIORITY_DETERMINATION:
				setPriorityDetermination(PRIORITY_DETERMINATION_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case RTMGCPackage.TASK_PROPERTIES__COUNT:
				return count != null;
			case RTMGCPackage.TASK_PROPERTIES__LOAD:
				return load != null;
			case RTMGCPackage.TASK_PROPERTIES__PER_TASK_GROUP:
				return perTaskGroup != null;
			case RTMGCPackage.TASK_PROPERTIES__MTA:
				return mta != null;
			case RTMGCPackage.TASK_PROPERTIES__DEADLINE_FACTOR:
				return deadlineFactor != null;
			case RTMGCPackage.TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS:
				return callSequencesBetweenSchedulePoints != null;
			case RTMGCPackage.TASK_PROPERTIES__CALL_GRAPHS:
				return callGraphs != null;
			case RTMGCPackage.TASK_PROPERTIES__MAPPING_DETERMINATION:
				return mappingDetermination != MAPPING_DETERMINATION_EDEFAULT;
			case RTMGCPackage.TASK_PROPERTIES__PRIORITY_DETERMINATION:
				return priorityDetermination != PRIORITY_DETERMINATION_EDEFAULT;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (mappingDetermination: ");
		result.append(mappingDetermination);
		result.append(", priorityDetermination: ");
		result.append(priorityDetermination);
		result.append(')');
		return result.toString();
	}

} //TaskPropertiesImpl
