/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

interface NumericTypesTestInterface {
  byte byteReturnOperation();
  void byteArgumentOperation(byte arg1);
  attribute byte byteProperty;

  octet octetReturnOperation();
  void octetArgumentOperation(octet arg1);
  attribute octet octetProperty;

  short shortReturnOperation();
  void shortArgumentOperation(short arg1);
  attribute short shortProperty;

  unsigned short unsignedShortReturnOperation();
  void unsignedShortArgumentOperation(unsigned short arg1);
  attribute unsigned short unsignedShortProperty;

  long longReturnOperation();
  void longArgumentOperation(long arg1);
  attribute long longProperty;

  unsigned long unsignedLongReturnOperation();
  void unsignedLongArgumentOperation(unsigned long arg1);
  attribute unsigned long unsignedLongProperty;

  long long longLongReturnOperation();
  void longLongArgumentOperation(long long arg1);
  attribute long long longLongProperty;

  unsigned long long unsignedLongLongReturnOperation();
  void unsignedLongLongArgumentOperation(unsigned long long arg1);
  attribute unsigned long long unsignedLongLongProperty;

  double doubleReturnOperation();
  void doubleArgumentOperation(double arg1);
  attribute double doubleProperty;

  unrestricted double unrestrictedDoubleReturnOperation();
  void unrestrictedDoubleArgumentOperation(unrestricted double arg1);
  attribute unrestricted double unrestrictedDoubleProperty;
};
