/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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.
 */

package android.hardware.tests.pointer@1.0;

interface IPointer {
  struct S { int32_t data; };
  struct A { S s; };
  // type declarations
  struct Sam { int32_t data; };
  struct Ada { ref<Sam> s_ptr; };
  struct Bob { ref<Ada> a_ptr; ref<Sam> s_ptr; };
  struct Cin { Ada a; ref<Bob> b_ptr; };
  struct Dom { Cin c; };

  typedef ref<int32_t> Int32Ptr;
  typedef ref<Sam>     SamPtr;

  struct Ptr {
    ref<Ada>[5] ptr_array;
    ref<Ada[5]> array_ptr;
    Int32Ptr int_ptr;
    ref<int32_t[5]> int_array_ptr;
    ref<int32_t>[5] int_ptr_array;
    ref<string> str_ref;
    vec<ref<Ada>> a_ptr_vec;
    ref<vec<Ada>> a_vec_ptr;
  };

  // test cases
  foo1(Sam s, SamPtr s_ptr);
  foo2(Sam s, Ada a);
  foo3(Sam s, Ada a, Bob b);
  foo4(ref<Sam> s_ptr);
  foo5(Ada a, Bob b);
  foo6(ref<Ada> a_ptr);
  foo7(ref<Ada> a_ptr, ref<Bob> b_ptr);
  foo8(Dom d);
  foo9(ref<string> str_ref);
  foo10(vec<ref<Sam>> s_ptr_vec);
  foo11(ref<vec<Sam>> s_vec_ptr);
  foo12(ref<Sam[5]> s_array_ref);
  foo13(ref<Sam>[5] s_ref_array);
  foo14(ref<ref<ref<Sam>>> s_3ptr);
  foo15(ref<ref<ref<int32_t>>> i_3ptr);
  foo16(Ptr p);
  foo17(ref<Ptr> p);
  foo18(ref<string> str_ref, ref<string> str_ref2, string str);
  foo19(ref<vec<Ada>> a_vec_ref, vec<Ada> a_vec, ref<vec<Ada>> a_vec_ref2);
  foo20(vec<ref<Sam>> s_ptr_vec);
  foo21(ref<Ada[1][2][3]> a_array_ptr);
  foo22(ref<Ada>[1][2][3] a_ptr_array);

  bar1() generates (Sam s, ref<Sam> s_ptr);
  bar2() generates (Sam s, Ada a);
  bar3() generates (Sam s, Ada a, Bob b);
  bar4() generates (ref<Sam> s_ptr);
  bar5() generates (Ada a, Bob b);
  bar6() generates (ref<Ada> a_ptr);
  bar7() generates (ref<Ada> a_ptr, ref<Bob> b_ptr);
  bar8() generates (Dom d);
  bar9() generates (ref<string> str_ref);
  bar10() generates (vec<ref<Sam>> s_ptr_vec);
  bar11() generates (ref<vec<Sam>> s_vec_ptr);
  bar12() generates (ref<Sam[5]> s_array_ref);
  bar13() generates (ref<Sam>[5] s_ref_array);
  bar14() generates (ref<ref<ref<Sam>>> s_3ptr);
  bar15() generates (ref<ref<ref<int32_t>>> i_3ptr);
  bar16() generates (Ptr p);
  bar17() generates (ref<Ptr> p);
  bar18() generates (ref<string> str_ref, ref<string> str_ref2, string str);
  bar19() generates (ref<vec<Ada>> a_vec_ref, vec<Ada> a_vec, ref<vec<Ada>> a_vec_ref2);
  bar20() generates (vec<ref<Sam>> s_ptr_vec);
  bar21() generates (ref<Ada[1][2][3]> a_array_ptr);
  bar22() generates (ref<Ada>[1][2][3] a_ptr_array);

  getErrors() generates(int32_t errors);
};
