/**
 *  * 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.gt;

import org.eclipse.emf.common.util.EList;

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

import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.definitions.Machine;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>GT Pattern</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getSymParameters <em>Sym Parameters</em>}</li>
 *   <li>{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getPatternBodies <em>Pattern Bodies</em>}</li>
 *   <li>{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getNamespace <em>Namespace</em>}</li>
 *   <li>{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#isDistinctMatching <em>Distinct Matching</em>}</li>
 *   <li>{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getContainer <em>Container</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern()
 * @model
 * @generated
 */
public interface GTPattern extends GTASMElement
{
  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  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";

  /**
   * Returns the value of the '<em><b>Sym Parameters</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.PatternVariable}.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Sym Parameters</em>' containment reference list isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Sym Parameters</em>' containment reference list.
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern_SymParameters()
   * @model containment="true" ordered="false"
   * @generated
   */
  EList<PatternVariable> getSymParameters();

  /**
   * Returns the value of the '<em><b>Pattern Bodies</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPatternBody}.
   * It is bidirectional and its opposite is '{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPatternBody#getHeader <em>Header</em>}'.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Pattern Bodies</em>' containment reference list isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Pattern Bodies</em>' containment reference list.
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern_PatternBodies()
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPatternBody#getHeader
   * @model opposite="header" containment="true" ordered="false"
   * @generated
   */
  EList<GTPatternBody> getPatternBodies();

  /**
   * Returns the value of the '<em><b>Namespace</b></em>' reference.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Namespace</em>' reference isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Namespace</em>' reference.
   * @see #setNamespace(Machine)
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern_Namespace()
   * @model required="true"
   * @generated
   */
  Machine getNamespace();

  /**
   * Sets the value of the '{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getNamespace <em>Namespace</em>}' reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Namespace</em>' reference.
   * @see #getNamespace()
   * @generated
   */
  void setNamespace(Machine value);

  /**
   * Returns the value of the '<em><b>Distinct Matching</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Distinct Matching</em>' attribute isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Distinct Matching</em>' attribute.
   * @see #setDistinctMatching(boolean)
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern_DistinctMatching()
   * @model default="true"
   * @generated
   */
  boolean isDistinctMatching();

  /**
   * Sets the value of the '{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#isDistinctMatching <em>Distinct Matching</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Distinct Matching</em>' attribute.
   * @see #isDistinctMatching()
   * @generated
   */
  void setDistinctMatching(boolean value);

  /**
   * Returns the value of the '<em><b>Container</b></em>' container reference.
   * It is bidirectional and its opposite is '{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.PatternContainer#getGtPatternDefinitions <em>Gt Pattern Definitions</em>}'.
   * <!-- begin-user-doc -->
   * <p>
   * If the meaning of the '<em>Container</em>' container reference isn't clear,
   * there really should be more of a description here...
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Container</em>' container reference.
   * @see #setContainer(PatternContainer)
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GtPackage#getGTPattern_Container()
   * @see org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.PatternContainer#getGtPatternDefinitions
   * @model opposite="gtPatternDefinitions" required="true" transient="false"
   * @generated
   */
  PatternContainer getContainer();

  /**
   * Sets the value of the '{@link org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.gt.GTPattern#getContainer <em>Container</em>}' container reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Container</em>' container reference.
   * @see #getContainer()
   * @generated
   */
  void setContainer(PatternContainer value);

} // GTPattern
