/**
 * generated by Xtext 2.10.0
 */
package org.eclipse.qvtd.doc.minioclcs.impl;

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.qvtd.doc.minioclcs.ExpCS;
import org.eclipse.qvtd.doc.minioclcs.IteratorVarCS;
import org.eclipse.qvtd.doc.minioclcs.LoopExpCS;
import org.eclipse.qvtd.doc.minioclcs.MinioclcsPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Loop Exp CS</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.qvtd.doc.minioclcs.impl.LoopExpCSImpl#getItVar <em>It Var</em>}</li>
 *   <li>{@link org.eclipse.qvtd.doc.minioclcs.impl.LoopExpCSImpl#getExp <em>Exp</em>}</li>
 * </ul>
 *
 * @generated
 */
public class LoopExpCSImpl extends NavigationExpCSImpl implements LoopExpCS
{
  /**
	 * The cached value of the '{@link #getItVar() <em>It Var</em>}' containment reference.
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @see #getItVar()
	 * @generated
	 * @ordered
	 */
  protected IteratorVarCS itVar;

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

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

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

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public IteratorVarCS getItVar()
  {
		return itVar;
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public NotificationChain basicSetItVar(IteratorVarCS newItVar, NotificationChain msgs)
  {
		IteratorVarCS oldItVar = itVar;
		itVar = newItVar;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MinioclcsPackage.LOOP_EXP_CS__IT_VAR, oldItVar, newItVar);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public void setItVar(IteratorVarCS newItVar)
  {
		if (newItVar != itVar) {
			NotificationChain msgs = null;
			if (itVar != null)
				msgs = ((InternalEObject)itVar).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MinioclcsPackage.LOOP_EXP_CS__IT_VAR, null, msgs);
			if (newItVar != null)
				msgs = ((InternalEObject)newItVar).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MinioclcsPackage.LOOP_EXP_CS__IT_VAR, null, msgs);
			msgs = basicSetItVar(newItVar, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MinioclcsPackage.LOOP_EXP_CS__IT_VAR, newItVar, newItVar));
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public ExpCS getExp()
  {
		return exp;
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public NotificationChain basicSetExp(ExpCS newExp, NotificationChain msgs)
  {
		ExpCS oldExp = exp;
		exp = newExp;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MinioclcsPackage.LOOP_EXP_CS__EXP, oldExp, newExp);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  public void setExp(ExpCS newExp)
  {
		if (newExp != exp) {
			NotificationChain msgs = null;
			if (exp != null)
				msgs = ((InternalEObject)exp).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MinioclcsPackage.LOOP_EXP_CS__EXP, null, msgs);
			if (newExp != null)
				msgs = ((InternalEObject)newExp).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MinioclcsPackage.LOOP_EXP_CS__EXP, null, msgs);
			msgs = basicSetExp(newExp, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, MinioclcsPackage.LOOP_EXP_CS__EXP, newExp, newExp));
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  @Override
  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
  {
		switch (featureID) {
			case MinioclcsPackage.LOOP_EXP_CS__IT_VAR:
				return basicSetItVar(null, msgs);
			case MinioclcsPackage.LOOP_EXP_CS__EXP:
				return basicSetExp(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 MinioclcsPackage.LOOP_EXP_CS__IT_VAR:
				return getItVar();
			case MinioclcsPackage.LOOP_EXP_CS__EXP:
				return getExp();
		}
		return super.eGet(featureID, resolve, coreType);
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  @Override
  public void eSet(int featureID, Object newValue)
  {
		switch (featureID) {
			case MinioclcsPackage.LOOP_EXP_CS__IT_VAR:
				setItVar((IteratorVarCS)newValue);
				return;
			case MinioclcsPackage.LOOP_EXP_CS__EXP:
				setExp((ExpCS)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  @Override
  public void eUnset(int featureID)
  {
		switch (featureID) {
			case MinioclcsPackage.LOOP_EXP_CS__IT_VAR:
				setItVar((IteratorVarCS)null);
				return;
			case MinioclcsPackage.LOOP_EXP_CS__EXP:
				setExp((ExpCS)null);
				return;
		}
		super.eUnset(featureID);
	}

  /**
	 * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
	 * @generated
	 */
  @Override
  public boolean eIsSet(int featureID)
  {
		switch (featureID) {
			case MinioclcsPackage.LOOP_EXP_CS__IT_VAR:
				return itVar != null;
			case MinioclcsPackage.LOOP_EXP_CS__EXP:
				return exp != null;
		}
		return super.eIsSet(featureID);
	}

} //LoopExpCSImpl
