/**
 *  * Copyright (c) 2006-2010 Istvan Rath and Daniel Varro
 *  * 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
 *  *
 *  * Contributors:
 *  *    Istvan Rath, Daniel Varro - initial API and implementation
 * 
 */
package org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.compoundRules.util;

import java.util.List;

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

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.compoundRules.*;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.AnnotatedElement;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.GTASMElement;

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.simpleRules.ASMRuleInvocation;

/**
 * <!-- begin-user-doc -->
 * The <b>Switch</b> for the model's inheritance hierarchy.
 * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
 * to invoke the <code>caseXXX</code> method for each class of the model,
 * starting with the actual class of the object
 * and proceeding up the inheritance hierarchy
 * until a non-null result is returned,
 * which is the result of the switch.
 * <!-- end-user-doc -->
 * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.compoundRules.CompoundRulesPackage
 * @generated
 */
public class CompoundRulesSwitch<T>
{
  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public static final String copyright = " * Copyright (c) 2006-2010 Istvan Rath and Daniel Varro\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors:\r\n *    Istvan Rath, Daniel Varro - initial API and implementation\r\n";

  /**
   * The cached model package
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  protected static CompoundRulesPackage modelPackage;

  /**
   * Creates an instance of the switch.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public CompoundRulesSwitch()
  {
    if (modelPackage == null)
    {
      modelPackage = CompoundRulesPackage.eINSTANCE;
    }
  }

  /**
   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the first non-null result returned by a <code>caseXXX</code> call.
   * @generated
   */
  public T doSwitch(EObject theEObject)
  {
    return doSwitch(theEObject.eClass(), theEObject);
  }

  /**
   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the first non-null result returned by a <code>caseXXX</code> call.
   * @generated
   */
  protected T doSwitch(EClass theEClass, EObject theEObject)
  {
    if (theEClass.eContainer() == modelPackage)
    {
      return doSwitch(theEClass.getClassifierID(), theEObject);
    }
    else
    {
      List<EClass> eSuperTypes = theEClass.getESuperTypes();
      return
        eSuperTypes.isEmpty() ?
          defaultCase(theEObject) :
          doSwitch(eSuperTypes.get(0), theEObject);
    }
  }

  /**
   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the first non-null result returned by a <code>caseXXX</code> call.
   * @generated
   */
  protected T doSwitch(int classifierID, EObject theEObject)
  {
    switch (classifierID)
    {
      case CompoundRulesPackage.SEQUENTIAL_RULE:
      {
        SequentialRule sequentialRule = (SequentialRule)theEObject;
        T result = caseSequentialRule(sequentialRule);
        if (result == null) result = caseNestedRule(sequentialRule);
        if (result == null) result = caseASMRuleInvocation(sequentialRule);
        if (result == null) result = caseGTASMElement(sequentialRule);
        if (result == null) result = caseAnnotatedElement(sequentialRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.NESTED_RULE:
      {
        NestedRule nestedRule = (NestedRule)theEObject;
        T result = caseNestedRule(nestedRule);
        if (result == null) result = caseASMRuleInvocation(nestedRule);
        if (result == null) result = caseGTASMElement(nestedRule);
        if (result == null) result = caseAnnotatedElement(nestedRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.RANDOM_RULE:
      {
        RandomRule randomRule = (RandomRule)theEObject;
        T result = caseRandomRule(randomRule);
        if (result == null) result = caseNestedRule(randomRule);
        if (result == null) result = caseASMRuleInvocation(randomRule);
        if (result == null) result = caseGTASMElement(randomRule);
        if (result == null) result = caseAnnotatedElement(randomRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.PARALLEL_RULE:
      {
        ParallelRule parallelRule = (ParallelRule)theEObject;
        T result = caseParallelRule(parallelRule);
        if (result == null) result = caseNestedRule(parallelRule);
        if (result == null) result = caseASMRuleInvocation(parallelRule);
        if (result == null) result = caseGTASMElement(parallelRule);
        if (result == null) result = caseAnnotatedElement(parallelRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.CHOOSE_RULE:
      {
        ChooseRule chooseRule = (ChooseRule)theEObject;
        T result = caseChooseRule(chooseRule);
        if (result == null) result = caseCollectionIteratorRule(chooseRule);
        if (result == null) result = caseBlockRule(chooseRule);
        if (result == null) result = caseCompoundRule(chooseRule);
        if (result == null) result = caseASMRuleInvocation(chooseRule);
        if (result == null) result = caseGTASMElement(chooseRule);
        if (result == null) result = caseAnnotatedElement(chooseRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.COLLECTION_ITERATOR_RULE:
      {
        CollectionIteratorRule collectionIteratorRule = (CollectionIteratorRule)theEObject;
        T result = caseCollectionIteratorRule(collectionIteratorRule);
        if (result == null) result = caseBlockRule(collectionIteratorRule);
        if (result == null) result = caseCompoundRule(collectionIteratorRule);
        if (result == null) result = caseASMRuleInvocation(collectionIteratorRule);
        if (result == null) result = caseGTASMElement(collectionIteratorRule);
        if (result == null) result = caseAnnotatedElement(collectionIteratorRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.COMPOUND_RULE:
      {
        CompoundRule compoundRule = (CompoundRule)theEObject;
        T result = caseCompoundRule(compoundRule);
        if (result == null) result = caseASMRuleInvocation(compoundRule);
        if (result == null) result = caseGTASMElement(compoundRule);
        if (result == null) result = caseAnnotatedElement(compoundRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.FORALL_RULE:
      {
        ForallRule forallRule = (ForallRule)theEObject;
        T result = caseForallRule(forallRule);
        if (result == null) result = caseCollectionIteratorRule(forallRule);
        if (result == null) result = caseBlockRule(forallRule);
        if (result == null) result = caseCompoundRule(forallRule);
        if (result == null) result = caseASMRuleInvocation(forallRule);
        if (result == null) result = caseGTASMElement(forallRule);
        if (result == null) result = caseAnnotatedElement(forallRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.ITERATE_RULE:
      {
        IterateRule iterateRule = (IterateRule)theEObject;
        T result = caseIterateRule(iterateRule);
        if (result == null) result = caseCompoundRule(iterateRule);
        if (result == null) result = caseASMRuleInvocation(iterateRule);
        if (result == null) result = caseGTASMElement(iterateRule);
        if (result == null) result = caseAnnotatedElement(iterateRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.LET_RULE:
      {
        LetRule letRule = (LetRule)theEObject;
        T result = caseLetRule(letRule);
        if (result == null) result = caseBlockRule(letRule);
        if (result == null) result = caseCompoundRule(letRule);
        if (result == null) result = caseASMRuleInvocation(letRule);
        if (result == null) result = caseGTASMElement(letRule);
        if (result == null) result = caseAnnotatedElement(letRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.BLOCK_RULE:
      {
        BlockRule blockRule = (BlockRule)theEObject;
        T result = caseBlockRule(blockRule);
        if (result == null) result = caseCompoundRule(blockRule);
        if (result == null) result = caseASMRuleInvocation(blockRule);
        if (result == null) result = caseGTASMElement(blockRule);
        if (result == null) result = caseAnnotatedElement(blockRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      case CompoundRulesPackage.WHEN_RULE:
      {
        WhenRule whenRule = (WhenRule)theEObject;
        T result = caseWhenRule(whenRule);
        if (result == null) result = caseCompoundRule(whenRule);
        if (result == null) result = caseASMRuleInvocation(whenRule);
        if (result == null) result = caseGTASMElement(whenRule);
        if (result == null) result = caseAnnotatedElement(whenRule);
        if (result == null) result = defaultCase(theEObject);
        return result;
      }
      default: return defaultCase(theEObject);
    }
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Sequential Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Sequential Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseSequentialRule(SequentialRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Nested Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Nested Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseNestedRule(NestedRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Random Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Random Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseRandomRule(RandomRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Parallel Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Parallel Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseParallelRule(ParallelRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Choose Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Choose Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseChooseRule(ChooseRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Collection Iterator Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Collection Iterator Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseCollectionIteratorRule(CollectionIteratorRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Compound Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Compound Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseCompoundRule(CompoundRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Forall Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Forall Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseForallRule(ForallRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Iterate Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Iterate Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseIterateRule(IterateRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Let Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Let Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseLetRule(LetRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Block Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Block Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseBlockRule(BlockRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>When Rule</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>When Rule</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseWhenRule(WhenRule object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>Annotated Element</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>Annotated Element</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseAnnotatedElement(AnnotatedElement object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>GTASM Element</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>GTASM Element</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseGTASMElement(GTASMElement object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>ASM Rule Invocation</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>ASM Rule Invocation</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
   * @generated
   */
  public T caseASMRuleInvocation(ASMRuleInvocation object)
  {
    return null;
  }

  /**
   * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
   * <!-- begin-user-doc -->
   * This implementation returns null;
   * returning a non-null result will terminate the switch, but this is the last case anyway.
   * <!-- end-user-doc -->
   * @param object the target of the switch.
   * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
   * @see #doSwitch(org.eclipse.emf.ecore.EObject)
   * @generated
   */
  public T defaultCase(EObject object)
  {
    return null;
  }

} //CompoundRulesSwitch
