/**
 * Copyright (c) 2010-2012 ISBAN S.L
 * 
 * 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:
 * 		Ruben De Dios (ISBAN S.L)
 * 		Andrez Alvarez Mattos (ISBAN S.L)
 */
package org.eclipse.gmf.tooling.simplemap.simplemappings.util;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.util.Switch;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildReference;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleCompartment;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleLabelNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleLinkMapping;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleMapping;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleMappingElementWithFigure;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleNodeReference;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleParentNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleSubNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleTopNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimplemappingsPackage;

/**
 * <!-- 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.gmf.tooling.simplemap.simplemappings.SimplemappingsPackage
 * @generated
 */
public class SimplemappingsSwitch<T> extends Switch<T> {

	/**
	 * The cached model package
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected static SimplemappingsPackage modelPackage;

	/**
	 * Creates an instance of the switch.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SimplemappingsSwitch() {
		if (modelPackage == null) {
			modelPackage = SimplemappingsPackage.eINSTANCE;
		}
	}

	/**
	 * Checks whether this is a switch for the given package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @parameter ePackage the package in question.
	 * @return whether this is a switch for the given package.
	 * @generated
	 */
	@Override
	protected boolean isSwitchFor(EPackage ePackage) {
		return ePackage == modelPackage;
	}

	/**
	 * 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
	 */
	@Override
	protected T doSwitch(int classifierID, EObject theEObject) {
		switch (classifierID) {
		case SimplemappingsPackage.SIMPLE_MAPPING: {
			SimpleMapping simpleMapping = (SimpleMapping) theEObject;
			T result = caseSimpleMapping(simpleMapping);
			if (result == null)
				result = caseSimpleParentNode(simpleMapping);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_TOP_NODE: {
			SimpleTopNode simpleTopNode = (SimpleTopNode) theEObject;
			T result = caseSimpleTopNode(simpleTopNode);
			if (result == null)
				result = caseSimpleNode(simpleTopNode);
			if (result == null)
				result = caseSimpleParentNode(simpleTopNode);
			if (result == null)
				result = caseSimpleChildNode(simpleTopNode);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleTopNode);
			if (result == null)
				result = caseSimpleNodeReference(simpleTopNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_COMPARTMENT: {
			SimpleCompartment simpleCompartment = (SimpleCompartment) theEObject;
			T result = caseSimpleCompartment(simpleCompartment);
			if (result == null)
				result = caseSimpleParentNode(simpleCompartment);
			if (result == null)
				result = caseSimpleChildNode(simpleCompartment);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleCompartment);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_LABEL_NODE: {
			SimpleLabelNode simpleLabelNode = (SimpleLabelNode) theEObject;
			T result = caseSimpleLabelNode(simpleLabelNode);
			if (result == null)
				result = caseSimpleNode(simpleLabelNode);
			if (result == null)
				result = caseSimpleChildNode(simpleLabelNode);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleLabelNode);
			if (result == null)
				result = caseSimpleNodeReference(simpleLabelNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_LINK_MAPPING: {
			SimpleLinkMapping simpleLinkMapping = (SimpleLinkMapping) theEObject;
			T result = caseSimpleLinkMapping(simpleLinkMapping);
			if (result == null)
				result = caseSimpleChildNode(simpleLinkMapping);
			if (result == null)
				result = caseSimpleParentNode(simpleLinkMapping);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleLinkMapping);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_NODE: {
			SimpleNode simpleNode = (SimpleNode) theEObject;
			T result = caseSimpleNode(simpleNode);
			if (result == null)
				result = caseSimpleChildNode(simpleNode);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleNode);
			if (result == null)
				result = caseSimpleNodeReference(simpleNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_PARENT_NODE: {
			SimpleParentNode simpleParentNode = (SimpleParentNode) theEObject;
			T result = caseSimpleParentNode(simpleParentNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_CHILD_NODE: {
			SimpleChildNode simpleChildNode = (SimpleChildNode) theEObject;
			T result = caseSimpleChildNode(simpleChildNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_SUB_NODE: {
			SimpleSubNode simpleSubNode = (SimpleSubNode) theEObject;
			T result = caseSimpleSubNode(simpleSubNode);
			if (result == null)
				result = caseSimpleNode(simpleSubNode);
			if (result == null)
				result = caseSimpleParentNode(simpleSubNode);
			if (result == null)
				result = caseSimpleChildNode(simpleSubNode);
			if (result == null)
				result = caseSimpleMappingElementWithFigure(simpleSubNode);
			if (result == null)
				result = caseSimpleNodeReference(simpleSubNode);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_MAPPING_ELEMENT_WITH_FIGURE: {
			SimpleMappingElementWithFigure simpleMappingElementWithFigure = (SimpleMappingElementWithFigure) theEObject;
			T result = caseSimpleMappingElementWithFigure(simpleMappingElementWithFigure);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_CHILD_REFERENCE: {
			SimpleChildReference simpleChildReference = (SimpleChildReference) theEObject;
			T result = caseSimpleChildReference(simpleChildReference);
			if (result == null)
				result = caseSimpleNodeReference(simpleChildReference);
			if (result == null)
				result = caseSimpleChildNode(simpleChildReference);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		case SimplemappingsPackage.SIMPLE_NODE_REFERENCE: {
			SimpleNodeReference simpleNodeReference = (SimpleNodeReference) theEObject;
			T result = caseSimpleNodeReference(simpleNodeReference);
			if (result == null)
				result = defaultCase(theEObject);
			return result;
		}
		default:
			return defaultCase(theEObject);
		}
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Mapping</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>Simple Mapping</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleMapping(SimpleMapping object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Top Node</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>Simple Top Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleTopNode(SimpleTopNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Compartment</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>Simple Compartment</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleCompartment(SimpleCompartment object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Label Node</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>Simple Label Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleLabelNode(SimpleLabelNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Link Mapping</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>Simple Link Mapping</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleLinkMapping(SimpleLinkMapping object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Node</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>Simple Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleNode(SimpleNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Parent Node</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>Simple Parent Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleParentNode(SimpleParentNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Child Node</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>Simple Child Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleChildNode(SimpleChildNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Sub Node</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>Simple Sub Node</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleSubNode(SimpleSubNode object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Mapping Element With Figure</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>Simple Mapping Element With Figure</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleMappingElementWithFigure(SimpleMappingElementWithFigure object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Child Reference</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>Simple Child Reference</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleChildReference(SimpleChildReference object) {
		return null;
	}

	/**
	 * Returns the result of interpreting the object as an instance of '<em>Simple Node Reference</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>Simple Node Reference</em>'.
	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
	 * @generated
	 */
	public T caseSimpleNodeReference(SimpleNodeReference 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
	 */
	@Override
	public T defaultCase(EObject object) {
		return null;
	}

} //SimplemappingsSwitch
