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

import org.eclipse.emf.ecore.EObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Semaphore Access Properties</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitReadAccessCount <em>Per Unit Read Access Count</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitWriteAccessCount <em>Per Unit Write Access Count</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getRequestOrder <em>Request Order</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getAccessType <em>Access Type</em>}</li>
 * </ul>
 *
 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#getSemaphoreAccessProperties()
 * @model
 * @generated
 */
public interface SemaphoreAccessProperties extends EObject {
	/**
	 * Returns the value of the '<em><b>Per Unit Read Access Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Per Unit Read Access Count</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Per Unit Read Access Count</em>' containment reference.
	 * @see #setPerUnitReadAccessCount(IntegerDistribution)
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#getSemaphoreAccessProperties_PerUnitReadAccessCount()
	 * @model containment="true" required="true"
	 * @generated
	 */
	IntegerDistribution getPerUnitReadAccessCount();

	/**
	 * Sets the value of the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitReadAccessCount <em>Per Unit Read Access Count</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Per Unit Read Access Count</em>' containment reference.
	 * @see #getPerUnitReadAccessCount()
	 * @generated
	 */
	void setPerUnitReadAccessCount(IntegerDistribution value);

	/**
	 * Returns the value of the '<em><b>Per Unit Write Access Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Per Unit Write Access Count</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Per Unit Write Access Count</em>' containment reference.
	 * @see #setPerUnitWriteAccessCount(IntegerDistribution)
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#getSemaphoreAccessProperties_PerUnitWriteAccessCount()
	 * @model containment="true" required="true"
	 * @generated
	 */
	IntegerDistribution getPerUnitWriteAccessCount();

	/**
	 * Sets the value of the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitWriteAccessCount <em>Per Unit Write Access Count</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Per Unit Write Access Count</em>' containment reference.
	 * @see #getPerUnitWriteAccessCount()
	 * @generated
	 */
	void setPerUnitWriteAccessCount(IntegerDistribution value);

	/**
	 * Returns the value of the '<em><b>Request Order</b></em>' attribute.
	 * The default value is <code>"none"</code>.
	 * The literals are from the enumeration {@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Request Order</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Request Order</em>' attribute.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder
	 * @see #setRequestOrder(SemaphoreRequestOrder)
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#getSemaphoreAccessProperties_RequestOrder()
	 * @model default="none" unique="false" required="true"
	 * @generated
	 */
	SemaphoreRequestOrder getRequestOrder();

	/**
	 * Sets the value of the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getRequestOrder <em>Request Order</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Request Order</em>' attribute.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder
	 * @see #getRequestOrder()
	 * @generated
	 */
	void setRequestOrder(SemaphoreRequestOrder value);

	/**
	 * Returns the value of the '<em><b>Access Type</b></em>' attribute.
	 * The default value is <code>"RandRunnable"</code>.
	 * The literals are from the enumeration {@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Access Type</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Access Type</em>' attribute.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType
	 * @see #setAccessType(SemaphoreAccessType)
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#getSemaphoreAccessProperties_AccessType()
	 * @model default="RandRunnable" unique="false" required="true"
	 * @generated
	 */
	SemaphoreAccessType getAccessType();

	/**
	 * Sets the value of the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getAccessType <em>Access Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Access Type</em>' attribute.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType
	 * @see #getAccessType()
	 * @generated
	 */
	void setAccessType(SemaphoreAccessType value);

} // SemaphoreAccessProperties
