// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// A set of structs and interface methods designed to exercise fidl_encode,
// fidl_decode, and fidl_validate.

library fidl.test.coding;

protocol Handles {
    // Starting easy: just a handle.
    NonnullableHandle(handle h0);

    // Multiple handles!
    MultipleNonnullableHandles(uint32 data0, handle h0, uint64 data1, handle h1, handle h2, uint64 data2);
    MultipleNullableHandles(uint32 data0, handle? h0, uint64 data1, handle? h1, handle? h2, uint64 data2);
};

struct NonnullableHandleArray {
    array<handle>:4 handles;
};

protocol Arrays {
    ArrayOfNonnullableHandles(array<handle>:4 handles);
    ArrayOfNullableHandles(array<handle?>:4 handles);
    ArrayOfArrayOfNonnullableHandles(array<array<handle>:3>:4 handles);
    OutOfLineArrayOfNonnullableHandles(NonnullableHandleArray? handles);
};

protocol Strings {
    UnboundedNonnullableString(string s0);
    UnboundedNullableString(string? s0);
    Bounded32NonnullableString(string:32 s0);
    Bounded32NullableString(string:32? s0);
    MultipleNonnullableStrings(string s0, string s1);
    MultipleNullableStrings(string? s0, string? s1);
};

protocol Vectors {
    UnboundedNonnullableVectorOfHandles(vector<handle> vh0);
    UnboundedNullableVectorOfHandles(vector<handle>? vh0);
    Bounded32NonnullableVectorOfHandles(vector<handle>:32 vh0);
    Bounded32NullableVectorOfHandles(vector<handle>:32? vh0);
    MultipleNonnullableVectorsOfHandles(vector<handle> vh0, vector<handle> vh1);
    MultipleNullableVectorsOfHandles(vector<handle>? vh0, vector<handle>? vh1);
    UnboundedNonnullableVectorOfUint32s(vector<uint32> vu0);
    UnboundedNullableVectorOfUint32s(vector<uint32>? vu0);
    Bounded32NonnullableVectorOfUint32s(vector<uint32>:32 vu0);
    Bounded32NullableVectorOfUint32s(vector<uint32>:32? vu0);
    MultipleNonnullableVectorsOfUint32s(vector<uint32> vu0, vector<uint32> vu1);
    MultipleNullableVectorsOfUint32s(vector<uint32>? vu0, vector<uint32>? vu1);
};

union SingleHandleUnion {
    1: handle h0;
};

union MultipleHandlesUnion {
    1: handle h;
    2: array<handle>:2 hs;
    3: array<array<handle>:2>:2 hss;
};

union MaybeRecurse {
    1: handle h;
    2: MaybeRecurseHelper more;
};

// Unions cannot have nullable fields, so wrap it in a struct.
struct MaybeRecurseHelper {
    MaybeRecurse? more;
};

protocol Unions {
    SingleHandleUnion(SingleHandleUnion u);
    SingleHandleUnionPointer(SingleHandleUnion u);
    MultipleHandlesUnion(MultipleHandlesUnion u);
    MultipleHandlesUnionPointer(MultipleHandlesUnion? u);
    Recursion(MaybeRecurse u);
};

struct Inline3 {
    uint32 padding;
    handle h;
};

struct Inline2 {
    uint64 padding;
    Inline3 l3;
    handle h;
};

struct Inline1 {
    handle h;
    Inline2 l2;
    uint64 padding;
};

struct Inline0 {
    uint64 padding;
    Inline1 L1;
    handle h;
};

struct OutOfLine3 {
    uint32 padding;
    handle h;
};

struct OutOfLine2 {
    uint64 padding;
    OutOfLine3? l3_present;
    OutOfLine3? l3_absent;
    OutOfLine3 l3_inline;
};

struct OutOfLine1 {
    handle h;
    OutOfLine2? l2_present;
    OutOfLine2 l2_inline;
    OutOfLine2? l2_absent;
    uint64 padding;
};

struct OutOfLine0 {
    uint64 padding;
    OutOfLine1? l1_absent;
    OutOfLine1 l1_inline;
    handle h;
    OutOfLine1? l1_present;
};

protocol Structs {
    Inline(Inline0 l0);
    OutOfLine(OutOfLine0 l0);
};
