// Copyright 2020 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.

library measuretape;

using zx;

// 24 bytes + selected member size
resource union TopLevelUnion {
    1: uint64 primitive;
    2: handle handle;
    3: StructWithString struct_with_string;
    4: StructWithOptString struct_with_opt_string;
    5: Table table;
    6: array<byte>:12 array_of_twelve_bytes;
    7: array<string>:3 array_of_three_strings;
    8: array<handle>:3 array_of_three_handles;
    9: array<Table>:2 array_of_two_tables;
    10: array<Union>:2 array_of_two_unions;
    11: StructWithTwoArrays struct_with_two_arrays;
    12: array<StructWithOneHandle>:3 array_of_three_structs_with_one_handle;
    21: array<StructWithTwoHandles>:3 array_of_three_structs_with_two_handles;
    13: vector<byte> vector_of_bytes;
    14: vector<string> vector_of_strings;
    15: vector<handle> vector_of_handles;
    16: vector<Table> vector_of_tables;
    17: vector<Union> vector_of_unions;
    18: StructWithTwoVectors struct_with_two_vectors;
    19: vector<StructWithOneHandle> vector_of_structs_with_one_handle;
    20: vector<StructWithTwoHandles> vector_of_structs_with_two_handles;
    22: FlexibleUnion flexible_union;
    23: StructWithAVector struct_with_a_vector;
};

// 16 bytes + FIDL_ALIGN(string length)
struct StructWithString {
    string string;
};

// 16 bytes + FIDL_ALIGN(string length)
struct StructWithOptString {
    string? opt_string;
};

// 16 bytes + max_set_ordinal * 16 + sum of all set members
resource table Table {
    5: uint32 primitive;
    2: reserved;
    1: reserved;
    3: string string;
    4: handle handle;
};

// 24 bytes + selected member size
union Union {
    1: uint64 primitive;
};

flexible union FlexibleUnion {
    1: uint64 primitive;
};

// 64 bytes, i.e. 12 + 4 (padding) + 3 * 16
struct StructWithTwoArrays {
    array<byte>:12 array_of_twelve_bytes;
    array<string>:3 array_of_three_strings;
};

// 9 bytes
resource struct StructWithOneHandle {
    uint8 tiny1;
    zx.handle:VMO vmo;
    uint8 tiny2;
};

// 12 bytes
resource struct StructWithTwoHandles {
    uint8 tiny1;
    zx.handle:VMO vmo1;
    zx.handle:VMO vmo2;
};

// 32 bytes
struct StructWithTwoVectors {
    vector<byte>? vector_of_bytes;
    vector<string>? vector_of_strings;
};

// 16 bytes
struct StructWithAVector {
    vector<string:3>:5 vector_of_strings;
};
