// 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;
  [Clamp] attribute byte byteClampProperty;

  octet octetReturnOperation();
  void octetArgumentOperation(octet arg1);
  attribute octet octetProperty;
  [Clamp] attribute octet octetClampProperty;

  short shortReturnOperation();
  void shortArgumentOperation(short arg1);
  attribute short shortProperty;
  [Clamp] attribute short shortClampProperty;

  unsigned short unsignedShortReturnOperation();
  void unsignedShortArgumentOperation(unsigned short arg1);
  attribute unsigned short unsignedShortProperty;
  [Clamp] attribute unsigned short unsignedShortClampProperty;

  long longReturnOperation();
  void longArgumentOperation(long arg1);
  attribute long longProperty;
  [Clamp] attribute long longClampProperty;

  unsigned long unsignedLongReturnOperation();
  void unsignedLongArgumentOperation(unsigned long arg1);
  attribute unsigned long unsignedLongProperty;
  [Clamp] attribute unsigned long unsignedLongClampProperty;

  long long longLongReturnOperation();
  void longLongArgumentOperation(long long arg1);
  attribute long long longLongProperty;
  [Clamp] attribute long long longLongClampProperty;

  unsigned long long unsignedLongLongReturnOperation();
  void unsignedLongLongArgumentOperation(unsigned long long arg1);
  attribute unsigned long long unsignedLongLongProperty;
  [Clamp] attribute unsigned long long unsignedLongLongClampProperty;

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

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