/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.datamartdsl;

import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Attribute Filler Unsigned Integer Range</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getBeginRange <em>Begin Range</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getEndRange <em>End Range</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getBeginRangeRef <em>Begin Range Ref</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getRounded <em>Rounded</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange()
 * @model
 * @generated
 */
public interface AttributeFillerUnsignedIntegerRange extends AttributeFillerIntegerType {
	/**
	 * Returns the value of the '<em><b>Begin Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Begin Range</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Begin Range</em>' attribute.
	 * @see #setBeginRange(int)
	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange_BeginRange()
	 * @model unique="false"
	 * @generated
	 */
	int getBeginRange();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getBeginRange <em>Begin Range</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Begin Range</em>' attribute.
	 * @see #getBeginRange()
	 * @generated
	 */
	void setBeginRange(int value);

	/**
	 * Returns the value of the '<em><b>End Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>End Range</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>End Range</em>' attribute.
	 * @see #setEndRange(int)
	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange_EndRange()
	 * @model unique="false"
	 * @generated
	 */
	int getEndRange();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getEndRange <em>End Range</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>End Range</em>' attribute.
	 * @see #getEndRange()
	 * @generated
	 */
	void setEndRange(int value);

	/**
	 * Returns the value of the '<em><b>Begin Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Begin Range Ref</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Begin Range Ref</em>' reference.
	 * @see #setBeginRangeRef(LEntityAttribute)
	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange_BeginRangeRef()
	 * @model
	 * @generated
	 */
	LEntityAttribute getBeginRangeRef();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getBeginRangeRef <em>Begin Range Ref</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Begin Range Ref</em>' reference.
	 * @see #getBeginRangeRef()
	 * @generated
	 */
	void setBeginRangeRef(LEntityAttribute value);

	/**
	 * Returns the value of the '<em><b>End Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>End Range Ref</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>End Range Ref</em>' reference.
	 * @see #setEndRangeRef(LEntityAttribute)
	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange_EndRangeRef()
	 * @model
	 * @generated
	 */
	LEntityAttribute getEndRangeRef();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>End Range Ref</em>' reference.
	 * @see #getEndRangeRef()
	 * @generated
	 */
	void setEndRangeRef(LEntityAttribute value);

	/**
	 * Returns the value of the '<em><b>Rounded</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Rounded</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Rounded</em>' attribute.
	 * @see #setRounded(int)
	 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage#getAttributeFillerUnsignedIntegerRange_Rounded()
	 * @model unique="false"
	 * @generated
	 */
	int getRounded();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datamartdsl.AttributeFillerUnsignedIntegerRange#getRounded <em>Rounded</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Rounded</em>' attribute.
	 * @see #getRounded()
	 * @generated
	 */
	void setRounded(int value);

} // AttributeFillerUnsignedIntegerRange
