/*
 * Copyright (c) 2009, 2011-2013 Eike Stepper (Berlin, Germany) 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
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.model2.impl;

import org.eclipse.emf.cdo.tests.model1.VAT;
import org.eclipse.emf.cdo.tests.model2.Model2Package;
import org.eclipse.emf.cdo.tests.model2.Unsettable2WithDefault;

import org.eclipse.emf.internal.cdo.CDOObjectImpl;

import org.eclipse.emf.ecore.EClass;

import java.util.Date;

/**
 * <!-- begin-user-doc --> An implementation of the model object '<em><b>Unsettable2 With Default</b></em>'. <!--
 * end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#isUnsettableBoolean <em>Unsettable Boolean</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableByte <em>Unsettable Byte</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableChar <em>Unsettable Char</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableDate <em>Unsettable Date</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableDouble <em>Unsettable Double</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableFloat <em>Unsettable Float</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableInt <em>Unsettable Int</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableLong <em>Unsettable Long</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableShort <em>Unsettable Short</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableString <em>Unsettable String</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model2.impl.Unsettable2WithDefaultImpl#getUnsettableVAT <em>Unsettable VAT</em>}</li>
 * </ul>
 *
 * @generated
 */
public class Unsettable2WithDefaultImpl extends CDOObjectImpl implements Unsettable2WithDefault
{
  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  protected Unsettable2WithDefaultImpl()
  {
    super();
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  @Override
  protected EClass eStaticClass()
  {
    return Model2Package.eINSTANCE.getUnsettable2WithDefault();
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  @Override
  protected int eStaticFeatureCount()
  {
    return 0;
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isUnsettableBoolean()
  {
    return (Boolean)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableBoolean(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableBoolean(boolean newUnsettableBoolean)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableBoolean(), newUnsettableBoolean);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableBoolean()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableBoolean());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableBoolean()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableBoolean());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public byte getUnsettableByte()
  {
    return (Byte)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableByte(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableByte(byte newUnsettableByte)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableByte(), newUnsettableByte);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableByte()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableByte());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableByte()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableByte());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public char getUnsettableChar()
  {
    return (Character)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableChar(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableChar(char newUnsettableChar)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableChar(), newUnsettableChar);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableChar()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableChar());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableChar()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableChar());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public Date getUnsettableDate()
  {
    return (Date)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDate(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableDate(Date newUnsettableDate)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDate(), newUnsettableDate);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableDate()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDate());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableDate()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDate());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public double getUnsettableDouble()
  {
    return (Double)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDouble(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableDouble(double newUnsettableDouble)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDouble(), newUnsettableDouble);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableDouble()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDouble());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableDouble()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableDouble());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public float getUnsettableFloat()
  {
    return (Float)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableFloat(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableFloat(float newUnsettableFloat)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableFloat(), newUnsettableFloat);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableFloat()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableFloat());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableFloat()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableFloat());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public int getUnsettableInt()
  {
    return (Integer)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableInt(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableInt(int newUnsettableInt)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableInt(), newUnsettableInt);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableInt()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableInt());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableInt()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableInt());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public long getUnsettableLong()
  {
    return (Long)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableLong(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableLong(long newUnsettableLong)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableLong(), newUnsettableLong);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableLong()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableLong());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableLong()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableLong());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public short getUnsettableShort()
  {
    return (Short)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableShort(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableShort(short newUnsettableShort)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableShort(), newUnsettableShort);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableShort()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableShort());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableShort()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableShort());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public String getUnsettableString()
  {
    return (String)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableString(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableString(String newUnsettableString)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableString(), newUnsettableString);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableString()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableString());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableString()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableString());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public VAT getUnsettableVAT()
  {
    return (VAT)eGet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableVAT(), true);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void setUnsettableVAT(VAT newUnsettableVAT)
  {
    eSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableVAT(), newUnsettableVAT);
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public void unsetUnsettableVAT()
  {
    eUnset(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableVAT());
  }

  /**
   * <!-- begin-user-doc --> <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetUnsettableVAT()
  {
    return eIsSet(Model2Package.eINSTANCE.getUnsettable2WithDefault_UnsettableVAT());
  }

} // Unsettable2WithDefaultImpl
