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

#include "fidl_coded_types.h"

#include <lib/fidl/internal.h>

#include "array_util.h"
#include "fidl_structs.h"

// Handle types.
const FidlCodedHandle nonnullable_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nonnullable,
    .handle_subtype = ZX_OBJ_TYPE_NONE,
    .handle_rights = ZX_RIGHT_SAME_RIGHTS,
};
const FidlCodedHandle nullable_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nullable,
    .handle_subtype = ZX_OBJ_TYPE_NONE,
    .handle_rights = 0,
};
const FidlCodedHandle nullable_channel_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nullable,
    .handle_subtype = ZX_OBJ_TYPE_CHANNEL,
    .handle_rights = ZX_RIGHT_READ | ZX_RIGHT_WRITE,
};
const FidlCodedHandle nullable_vmo_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nullable,
    .handle_subtype = ZX_OBJ_TYPE_VMO,
    .handle_rights = 0,
};
const FidlCodedHandle nonnullable_channel_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nonnullable,
    .handle_subtype = ZX_OBJ_TYPE_CHANNEL,
    .handle_rights = ZX_RIGHT_READ | ZX_RIGHT_WRITE,
};
const FidlCodedHandle nonnullable_vmo_handle = {
    .tag = kFidlTypeHandle,
    .nullable = kFidlNullability_Nonnullable,
    .handle_subtype = ZX_OBJ_TYPE_VMO,
    .handle_rights = 0,
};

// Array types.
const FidlCodedArray array_of_two_nonnullable_handles = {
    .tag = kFidlTypeArray,
    .element_size_v2 = sizeof(zx_handle_t),
    .array_size_v2 = 2 * sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedArray array_of_four_nonnullable_handles = {
    .tag = kFidlTypeArray,
    .element_size_v2 = sizeof(zx_handle_t),
    .array_size_v2 = 4 * sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedArray array_of_five_nullable_handles = {
    .tag = kFidlTypeArray,
    .element_size_v2 = sizeof(zx_handle_t),
    .array_size_v2 = 5 * sizeof(zx_handle_t),
    .element = &nullable_handle,
};
const FidlCodedArray array_of_three_arrays_of_four_nonnullable_handles = {
    .tag = kFidlTypeArray,
    .element_size_v2 = 4 * sizeof(zx_handle_t),
    .array_size_v2 = 3 * 4 * sizeof(zx_handle_t),
    .element = &array_of_four_nonnullable_handles,
};
const FidlCodedArray array_of_two_arrays_of_two_nonnullable_handles = {
    .tag = kFidlTypeArray,
    .element_size_v2 = 2 * sizeof(zx_handle_t),
    .array_size_v2 = 2 * 2 * sizeof(zx_handle_t),
    .element = &array_of_two_nonnullable_handles,
};

// String types.
const FidlCodedString unbounded_nonnullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nonnullable,
    .max_size = FIDL_MAX_SIZE,
};
const FidlCodedString unbounded_nullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nullable,
    .max_size = FIDL_MAX_SIZE,
};
const FidlCodedString bounded_32_nonnullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nonnullable,
    .max_size = 32,
};
const FidlCodedString bounded_32_nullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nullable,
    .max_size = 32,
};
const FidlCodedString bounded_4_nonnullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nonnullable,
    .max_size = 4,
};
const FidlCodedString bounded_4_nullable_string = {
    .tag = kFidlTypeString,
    .nullable = kFidlNullability_Nullable,
    .max_size = 4,
};

// Vector types.
const FidlCodedVector unbounded_nonnullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = FIDL_MAX_SIZE,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedVector unbounded_nullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = FIDL_MAX_SIZE,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedVector bounded_32_nonnullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = 32,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedVector bounded_32_nullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = 32,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedVector bounded_2_nonnullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = 2,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};
const FidlCodedVector bounded_2_nullable_vector_of_handles = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = 2,
    .element_size_v2 = sizeof(zx_handle_t),
    .element = &nonnullable_handle,
};

const FidlCodedVector unbounded_nonnullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = FIDL_MAX_SIZE,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};
const FidlCodedVector unbounded_nullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = FIDL_MAX_SIZE,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};
const FidlCodedVector bounded_32_nonnullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = 32,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};
const FidlCodedVector bounded_32_nullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = 32,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};
const FidlCodedVector bounded_2_nonnullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nonnullable,
    .max_count = 2,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};
const FidlCodedVector bounded_2_nullable_vector_of_uint32 = {
    .tag = kFidlTypeVector,
    .nullable = kFidlNullability_Nullable,
    .max_count = 2,
    .element_size_v2 = sizeof(uint32_t),
    .element = nullptr,
};

// Handle messages.
static const FidlStructElement nonnullable_handle_message_elements[] = {
    FidlStructElement::Field(&nonnullable_handle,
                             offsetof(nonnullable_handle_message_layout, inline_struct.handle) -
                                 sizeof(fidl_message_header_t),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(nonnullable_handle_message_layout, inline_struct.handle) -
                                     sizeof(fidl_message_header_t) + 4,
                                 0xffffffff),
};
const FidlCodedStruct nonnullable_handle_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(nonnullable_handle_message_elements),
    .size_v2 = sizeof(nonnullable_handle_inline_data) - sizeof(fidl_message_header_t),
    .elements = nonnullable_handle_message_elements,
    .name = "nonnullable_handle_message",
};

static const FidlStructElement nonnullable_channel_message_elements[] = {
    FidlStructElement::Field(&nonnullable_channel_handle,
                             offsetof(nonnullable_handle_message_layout, inline_struct.handle) -
                                 sizeof(fidl_message_header_t),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(nonnullable_handle_message_layout, inline_struct.handle) -
                                     sizeof(fidl_message_header_t) + 4,
                                 0xffffffff),

};
const FidlCodedStruct nonnullable_channel_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(nonnullable_channel_message_elements),
    .size_v2 = sizeof(nonnullable_handle_inline_data) - sizeof(fidl_message_header_t),
    .elements = nonnullable_channel_message_elements,
    .name = "nonnullable_channel_message",
};

static const FidlStructElement multiple_nonnullable_handles_fields[] = {
    FidlStructElement::Field(
        &nonnullable_handle,
        offsetof(multiple_nonnullable_handles_message_layout, inline_struct.handle_0) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
    FidlStructElement::Field(
        &nonnullable_channel_handle,
        offsetof(multiple_nonnullable_handles_message_layout, inline_struct.handle_1) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
    FidlStructElement::Field(
        &nonnullable_vmo_handle,
        offsetof(multiple_nonnullable_handles_message_layout, inline_struct.handle_2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
};
const FidlCodedStruct multiple_nonnullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nonnullable_handles_fields),
    .size_v2 = sizeof(multiple_nonnullable_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nonnullable_handles_fields,
    .name = "multiple_nonnullable_handles_message",
};

static const FidlStructElement nullable_handle_fields[] = {
    FidlStructElement::Field(&nullable_handle,
                             offsetof(nullable_handle_message_layout, inline_struct.handle) -
                                 sizeof(fidl_message_header_t),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(nonnullable_handle_message_layout, inline_struct.handle) -
                                     sizeof(fidl_message_header_t) + 4,
                                 0xffffffff),
};
const FidlCodedStruct nullable_handle_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(nullable_handle_fields),
    .size_v2 = sizeof(nullable_handle_inline_data) - sizeof(fidl_message_header_t),
    .elements = nullable_handle_fields,
    .name = "nullable_handle_message",
};

static const FidlStructElement multiple_nullable_handles_fields[] = {
    FidlStructElement::Field(
        &nullable_handle,
        offsetof(multiple_nullable_handles_message_layout, inline_struct.handle_0) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
    FidlStructElement::Field(
        &nullable_channel_handle,
        offsetof(multiple_nullable_handles_message_layout, inline_struct.handle_1) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
    FidlStructElement::Field(
        &nullable_vmo_handle,
        offsetof(multiple_nullable_handles_message_layout, inline_struct.handle_2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
};
const FidlCodedStruct multiple_nullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nullable_handles_fields),
    .size_v2 = sizeof(multiple_nullable_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nullable_handles_fields,
    .name = "multiple_nullable_handles_message",
};

// Array messages.
static const FidlStructElement array_of_nonnullable_handles_fields[] = {
    FidlStructElement::Field(
        &array_of_four_nonnullable_handles,
        offsetof(array_of_nonnullable_handles_message_layout, inline_struct.handles) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
};
const FidlCodedStruct array_of_nonnullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(array_of_nonnullable_handles_fields),
    .size_v2 = sizeof(array_of_nonnullable_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = array_of_nonnullable_handles_fields,
    .name = "array_of_nonnullable_handles_message",
};

static const FidlStructElement array_of_nullable_handles_fields[] = {
    FidlStructElement::Field(
        &array_of_five_nullable_handles,
        offsetof(array_of_nullable_handles_message_layout, inline_struct.handles) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
};
const FidlCodedStruct array_of_nullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(array_of_nullable_handles_fields),
    .size_v2 = sizeof(array_of_nullable_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = array_of_nullable_handles_fields,
    .name = "array_of_nullable_handles_message",
};

static const FidlStructElement array_of_array_of_nonnullable_handles_fields[] = {
    FidlStructElement::Field(
        &array_of_three_arrays_of_four_nonnullable_handles,
        offsetof(array_of_array_of_nonnullable_handles_message_layout, inline_struct.handles) -
            sizeof(fidl_message_header_t),
        true),
};
const FidlCodedStruct array_of_array_of_nonnullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(array_of_array_of_nonnullable_handles_fields),
    .size_v2 =
        sizeof(array_of_array_of_nonnullable_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = array_of_array_of_nonnullable_handles_fields,
    .name = "array_of_array_of_nonnullable_handles_message",
};

static const FidlStructElement out_of_line_fields[] = {
    FidlStructElement::Field(&array_of_four_nonnullable_handles,
                             offsetof(array_of_nonnullable_handles, handles),
                             kFidlIsResource_Resource),

};
static const FidlCodedStruct out_of_line_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(out_of_line_fields),
    .size_v2 = sizeof(array_of_nonnullable_handles),
    .elements = out_of_line_fields,
    .name = "out_of_line",
};
static const FidlCodedStructPointer out_of_line_pointer_type = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &out_of_line_type.coded_struct(),
};

static const FidlStructElement out_of_line_array_of_nonnullable_handles_fields[] = {
    FidlStructElement::Field(&out_of_line_pointer_type,
                             offsetof(out_of_line_array_of_nonnullable_handles_message_layout,
                                      inline_struct.maybe_array) -
                                 sizeof(fidl_message_header_t),
                             true),
};
const FidlCodedStruct out_of_line_array_of_nonnullable_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(out_of_line_array_of_nonnullable_handles_fields),
    .size_v2 = sizeof(out_of_line_array_of_nonnullable_handles_inline_data) -
               sizeof(fidl_message_header_t),
    .elements = out_of_line_array_of_nonnullable_handles_fields,
    .name = "out_of_line_array_of_nonnullable_handles_message",
};

// String messages.
static const FidlStructElement unbounded_nonnullable_string_fields[] = {
    FidlStructElement::Field(
        &unbounded_nonnullable_string,
        offsetof(unbounded_nonnullable_string_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct unbounded_nonnullable_string_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nonnullable_string_fields),
    .size_v2 = sizeof(unbounded_nonnullable_string_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nonnullable_string_fields,
    .name = "unbounded_nonnullable_string_message",
};

static const FidlStructElement unbounded_nullable_string_fields[] = {
    FidlStructElement::Field(
        &unbounded_nullable_string,
        offsetof(unbounded_nullable_string_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct unbounded_nullable_string_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nullable_string_fields),
    .size_v2 = sizeof(unbounded_nullable_string_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nullable_string_fields,
    .name = "unbounded_nullable_string_message",
};

static const FidlStructElement bounded_32_nonnullable_string_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nonnullable_string,
        offsetof(bounded_32_nonnullable_string_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct bounded_32_nonnullable_string_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nonnullable_string_fields),
    .size_v2 = sizeof(bounded_32_nonnullable_string_inline_data) - sizeof(fidl_message_header_t),
    .elements = bounded_32_nonnullable_string_fields,
    .name = "bounded_32_nonnullable_string_message",
};

static const FidlStructElement bounded_32_nullable_string_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nullable_string,
        offsetof(bounded_32_nullable_string_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct bounded_32_nullable_string_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nullable_string_fields),
    .size_v2 = sizeof(bounded_32_nullable_string_inline_data) - sizeof(fidl_message_header_t),
    .elements = bounded_32_nullable_string_fields,
    .name = "bounded_32_nullable_string_message",
};

static const FidlStructElement multiple_nonnullable_strings_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nonnullable_string,
        offsetof(multiple_nonnullable_strings_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

    FidlStructElement::Field(
        &bounded_32_nonnullable_string,
        offsetof(multiple_nonnullable_strings_message_layout, inline_struct.string2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct multiple_nonnullable_strings_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nonnullable_strings_fields),
    .size_v2 = sizeof(multiple_nonnullable_strings_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nonnullable_strings_fields,
    .name = "multiple_nonnullable_strings_message",
};

static const FidlStructElement multiple_nullable_strings_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nullable_string,
        offsetof(multiple_nullable_strings_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

    FidlStructElement::Field(
        &bounded_32_nullable_string,
        offsetof(multiple_nullable_strings_message_layout, inline_struct.string2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct multiple_nullable_strings_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nullable_strings_fields),
    .size_v2 = sizeof(multiple_nullable_strings_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nullable_strings_fields,
    .name = "multiple_nullable_strings_message",
};

static const FidlStructElement multiple_short_nonnullable_strings_fields[] = {
    FidlStructElement::Field(
        &bounded_4_nonnullable_string,
        offsetof(multiple_short_nonnullable_strings_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

    FidlStructElement::Field(
        &bounded_32_nonnullable_string,
        offsetof(multiple_short_nonnullable_strings_message_layout, inline_struct.string2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct multiple_short_nonnullable_strings_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_short_nonnullable_strings_fields),
    .size_v2 =
        sizeof(multiple_short_nonnullable_strings_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_short_nonnullable_strings_fields,
    .name = "multiple_short_nonnullable_strings_message",
};

static const FidlStructElement multiple_short_nullable_strings_fields[] = {
    FidlStructElement::Field(
        &bounded_4_nullable_string,
        offsetof(multiple_short_nullable_strings_message_layout, inline_struct.string) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

    FidlStructElement::Field(
        &bounded_32_nullable_string,
        offsetof(multiple_short_nullable_strings_message_layout, inline_struct.string2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct multiple_short_nullable_strings_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_short_nullable_strings_fields),
    .size_v2 = sizeof(multiple_short_nullable_strings_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_short_nullable_strings_fields,
    .name = "multiple_short_nullable_strings_message",
};

// Vector messages.
static const FidlStructElement unbounded_nonnullable_vector_of_handles_fields[] = {
    FidlStructElement::Field(
        &unbounded_nonnullable_vector_of_handles,
        offsetof(unbounded_nonnullable_vector_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        true),

};
const FidlCodedStruct unbounded_nonnullable_vector_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nonnullable_vector_of_handles_fields),
    .size_v2 =
        sizeof(unbounded_nonnullable_vector_of_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nonnullable_vector_of_handles_fields,
    .name = "unbounded_nonnullable_vector_of_handles_message",
};

static const FidlStructElement unbounded_nullable_vector_of_handles_fields[] = {
    FidlStructElement::Field(
        &unbounded_nullable_vector_of_handles,
        offsetof(unbounded_nullable_vector_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),

};
const FidlCodedStruct unbounded_nullable_vector_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nullable_vector_of_handles_fields),
    .size_v2 =
        sizeof(unbounded_nullable_vector_of_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nullable_vector_of_handles_fields,
    .name = "unbounded_nullable_vector_of_handles_message",
};

static const FidlStructElement bounded_32_nonnullable_vector_of_handles_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nonnullable_vector_of_handles,
        offsetof(bounded_32_nonnullable_vector_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        true),

};
const FidlCodedStruct bounded_32_nonnullable_vector_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nonnullable_vector_of_handles_fields),
    .size_v2 = sizeof(bounded_32_nonnullable_vector_of_handles_inline_data) -
               sizeof(fidl_message_header_t),
    .elements = bounded_32_nonnullable_vector_of_handles_fields,
    .name = "bounded_32_nonnullable_vector_of_handles_message",
};

static const FidlStructElement bounded_32_nullable_vector_of_handles_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nullable_vector_of_handles,
        offsetof(bounded_32_nullable_vector_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),

};
const FidlCodedStruct bounded_32_nullable_vector_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nullable_vector_of_handles_fields),
    .size_v2 =
        sizeof(bounded_32_nullable_vector_of_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = bounded_32_nullable_vector_of_handles_fields,
    .name = "bounded_32_nullable_vector_of_handles_message",
};

static const FidlStructElement multiple_nonnullable_vectors_of_handles_fields[] = {
    FidlStructElement::Field(
        &bounded_2_nonnullable_vector_of_handles,
        offsetof(multiple_nonnullable_vectors_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        true),
    FidlStructElement::Field(
        &unbounded_nonnullable_vector_of_handles,
        offsetof(multiple_nonnullable_vectors_of_handles_message_layout, inline_struct.vector2) -
            sizeof(fidl_message_header_t),
        true),
};
const FidlCodedStruct multiple_nonnullable_vectors_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nonnullable_vectors_of_handles_fields),
    .size_v2 =
        sizeof(multiple_nonnullable_vectors_of_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nonnullable_vectors_of_handles_fields,
    .name = "multiple_nonnullable_vectors_of_handles_message",
};

static const FidlStructElement multiple_nullable_vectors_of_handles_fields[] = {
    FidlStructElement::Field(
        &bounded_2_nullable_vector_of_handles,
        offsetof(multiple_nullable_vectors_of_handles_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
    FidlStructElement::Field(
        &unbounded_nullable_vector_of_handles,
        offsetof(multiple_nullable_vectors_of_handles_message_layout, inline_struct.vector2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_Resource),
};
const FidlCodedStruct multiple_nullable_vectors_of_handles_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nullable_vectors_of_handles_fields),
    .size_v2 =
        sizeof(multiple_nullable_vectors_of_handles_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nullable_vectors_of_handles_fields,
    .name = "multiple_nullable_vectors_of_handles_message",
};

static const FidlStructElement unbounded_nonnullable_vector_of_uint32_fields[] = {
    FidlStructElement::Field(
        &unbounded_nonnullable_vector_of_uint32,
        offsetof(unbounded_nonnullable_vector_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        false),

};
const FidlCodedStruct unbounded_nonnullable_vector_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nonnullable_vector_of_uint32_fields),
    .size_v2 =
        sizeof(unbounded_nonnullable_vector_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nonnullable_vector_of_uint32_fields,
    .name = "unbounded_nonnullable_vector_of_uint32_message",
};

static const FidlStructElement unbounded_nullable_vector_of_uint32_fields[] = {
    FidlStructElement::Field(
        &unbounded_nullable_vector_of_uint32,
        offsetof(unbounded_nullable_vector_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct unbounded_nullable_vector_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(unbounded_nullable_vector_of_uint32_fields),
    .size_v2 =
        sizeof(unbounded_nullable_vector_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = unbounded_nullable_vector_of_uint32_fields,
    .name = "unbounded_nullable_vector_of_uint32_message",
};

static const FidlStructElement bounded_32_nonnullable_vector_of_uint32_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nonnullable_vector_of_uint32,
        offsetof(bounded_32_nonnullable_vector_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        false),

};
const FidlCodedStruct bounded_32_nonnullable_vector_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nonnullable_vector_of_uint32_fields),
    .size_v2 =
        sizeof(bounded_32_nonnullable_vector_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = bounded_32_nonnullable_vector_of_uint32_fields,
    .name = "bounded_32_nonnullable_vector_of_uint32_message",
};

static const FidlStructElement bounded_32_nullable_vector_of_uint32_fields[] = {
    FidlStructElement::Field(
        &bounded_32_nullable_vector_of_uint32,
        offsetof(bounded_32_nullable_vector_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct bounded_32_nullable_vector_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(bounded_32_nullable_vector_of_uint32_fields),
    .size_v2 =
        sizeof(bounded_32_nullable_vector_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = bounded_32_nullable_vector_of_uint32_fields,
    .name = "bounded_32_nullable_vector_of_uint32_message",
};

static const FidlStructElement multiple_nonnullable_vectors_of_uint32_fields[] = {
    FidlStructElement::Field(
        &bounded_2_nonnullable_vector_of_uint32,
        offsetof(multiple_nonnullable_vectors_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        false),
    FidlStructElement::Field(
        &unbounded_nonnullable_vector_of_uint32,
        offsetof(multiple_nonnullable_vectors_of_uint32_message_layout, inline_struct.vector2) -
            sizeof(fidl_message_header_t),
        false),
};
const FidlCodedStruct multiple_nonnullable_vectors_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nonnullable_vectors_of_uint32_fields),
    .size_v2 =
        sizeof(multiple_nonnullable_vectors_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nonnullable_vectors_of_uint32_fields,
    .name = "multiple_nonnullable_vectors_of_uint32_message",
};

static const FidlStructElement multiple_nullable_vectors_of_uint32_fields[] = {
    FidlStructElement::Field(
        &bounded_2_nullable_vector_of_uint32,
        offsetof(multiple_nullable_vectors_of_uint32_message_layout, inline_struct.vector) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
    FidlStructElement::Field(
        &unbounded_nullable_vector_of_uint32,
        offsetof(multiple_nullable_vectors_of_uint32_message_layout, inline_struct.vector2) -
            sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct multiple_nullable_vectors_of_uint32_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(multiple_nullable_vectors_of_uint32_fields),
    .size_v2 =
        sizeof(multiple_nullable_vectors_of_uint32_inline_data) - sizeof(fidl_message_header_t),
    .elements = multiple_nullable_vectors_of_uint32_fields,
    .name = "multiple_nullable_vectors_of_uint32_message",
};

// Struct messages.
static const FidlStructElement struct_level_3_fields[] = {
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_level_3, handle_3),
                             kFidlIsResource_Resource),
};
static const FidlCodedStruct struct_level_3_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_level_3_fields),
    .size_v2 = sizeof(struct_level_3),
    .elements = struct_level_3_fields,
    .name = "struct_level_3",
};
static const FidlStructElement struct_level_2_fields[] = {
    FidlStructElement::Field(&struct_level_3_struct, offsetof(struct_level_2, l3),
                             kFidlIsResource_NotResource),
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_level_2, handle_2),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(struct_level_2, handle_2) + 4, 0xffffffff),
};
static const FidlCodedStruct struct_level_2_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_level_2_fields),
    .size_v2 = sizeof(struct_level_2),
    .elements = struct_level_2_fields,
    .name = "struct_level_2",
};
static const FidlStructElement struct_level_1_fields[] = {
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_level_1, handle_1),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(struct_level_1, handle_1) + 4, 0xffffffff),
    FidlStructElement::Field(&struct_level_2_struct, offsetof(struct_level_1, l2),
                             kFidlIsResource_NotResource),
};
static const FidlCodedStruct struct_level_1_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_level_1_fields),
    .size_v2 = sizeof(struct_level_1),
    .elements = struct_level_1_fields,
    .name = "struct_level_1",
};
static const FidlStructElement struct_level_0_fields[] = {
    FidlStructElement::Field(&struct_level_1_struct, offsetof(struct_level_0, l1),
                             kFidlIsResource_NotResource),
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_level_0, handle_0),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(struct_level_0, handle_0) + 4, 0xffffffff),
};
const FidlCodedStruct struct_level_0_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_level_1_fields),
    .size_v2 = sizeof(struct_level_0),
    .elements = struct_level_0_fields,
    .name = "struct_level_0",
};
static const FidlStructElement nested_structs_fields[] = {
    FidlStructElement::Field(
        &struct_level_0_struct,
        offsetof(nested_structs_message_layout, inline_struct.l0) - sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),

};
const FidlCodedStruct nested_structs_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(nested_structs_fields),
    .size_v2 = sizeof(nested_structs_inline_data) - sizeof(fidl_message_header_t),
    .elements = nested_structs_fields,
    .name = "nested_structs_message",
};

// Struct pointer messages.
static const FidlStructElement struct_ptr_level_3_fields[] = {
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_ptr_level_3, handle_3),
                             kFidlIsResource_Resource),
};
static const FidlCodedStruct struct_ptr_level_3_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_ptr_level_3_fields),
    .size_v2 = sizeof(struct_ptr_level_3),
    .elements = struct_ptr_level_3_fields,
    .name = "struct_ptr_level_3",
};
static const FidlCodedStructPointer struct_ptr_level_3_struct_pointer = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &struct_ptr_level_3_struct.coded_struct(),
};
static const FidlStructElement struct_ptr_level_2_fields[] = {
    FidlStructElement::Field(&struct_ptr_level_3_struct_pointer,
                             offsetof(struct_ptr_level_2, l3_present), kFidlIsResource_NotResource),
    FidlStructElement::Field(&struct_ptr_level_3_struct_pointer,
                             offsetof(struct_ptr_level_2, l3_absent), kFidlIsResource_NotResource),
    FidlStructElement::Field(&struct_ptr_level_3_struct, offsetof(struct_ptr_level_2, l3_inline),
                             kFidlIsResource_NotResource),
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_ptr_level_2, handle_2),
                             kFidlIsResource_Resource),
};
static const FidlCodedStruct struct_ptr_level_2_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_ptr_level_2_fields),
    .size_v2 = sizeof(struct_ptr_level_2),
    .elements = struct_ptr_level_2_fields,
    .name = "struct_ptr_level_2",
};
static const FidlCodedStructPointer struct_ptr_level_2_struct_pointer = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &struct_ptr_level_2_struct.coded_struct(),
};
static const FidlStructElement struct_ptr_level_1_fields[] = {
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_ptr_level_1, handle_1),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(struct_ptr_level_1, handle_1) + 4, 0xffffffff),
    FidlStructElement::Field(&struct_ptr_level_2_struct_pointer,

                             offsetof(struct_ptr_level_1, l2_present), kFidlIsResource_NotResource),
    FidlStructElement::Field(&struct_ptr_level_2_struct, offsetof(struct_ptr_level_1, l2_inline),
                             kFidlIsResource_NotResource),
    FidlStructElement::Field(&struct_ptr_level_2_struct_pointer,
                             offsetof(struct_ptr_level_1, l2_absent), kFidlIsResource_NotResource),
};
static const FidlCodedStruct struct_ptr_level_1_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_ptr_level_1_fields),
    .size_v2 = sizeof(struct_ptr_level_1),
    .elements = struct_ptr_level_1_fields,
    .name = "struct_ptr_level_1",
};
static const FidlCodedStructPointer struct_ptr_level_1_struct_pointer = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &struct_ptr_level_1_struct.coded_struct(),
};
static const FidlStructElement struct_ptr_level_0_fields[] = {
    FidlStructElement::Field(&struct_ptr_level_1_struct_pointer,
                             offsetof(struct_ptr_level_0, l1_absent), kFidlIsResource_NotResource),
    FidlStructElement::Field(&struct_ptr_level_1_struct, offsetof(struct_ptr_level_0, l1_inline),
                             kFidlIsResource_NotResource),
    FidlStructElement::Field(&nonnullable_handle, offsetof(struct_ptr_level_0, handle_0),
                             kFidlIsResource_Resource),
    FidlStructElement::Padding32(offsetof(struct_ptr_level_0, handle_0) + 4, 0xffffffff),
    FidlStructElement::Field(&struct_ptr_level_1_struct_pointer,

                             offsetof(struct_ptr_level_0, l1_present), kFidlIsResource_NotResource),
};
static const FidlCodedStruct struct_ptr_level_0_struct = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(struct_ptr_level_0_fields),
    .size_v2 = sizeof(struct_ptr_level_0),
    .elements = struct_ptr_level_0_fields,
    .name = "struct_ptr_level_0",
};
const FidlCodedStructPointer struct_ptr_level_0_struct_pointer = {
    .tag = kFidlTypeStructPointer,
    .struct_type = &struct_ptr_level_0_struct.coded_struct(),
};
static const FidlStructElement nested_struct_ptrs_fields[] = {
    FidlStructElement::Field(
        &struct_ptr_level_0_struct,
        offsetof(nested_struct_ptrs_inline_data, l0_inline) - sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
    FidlStructElement::Field(
        &struct_ptr_level_0_struct_pointer,
        offsetof(nested_struct_ptrs_inline_data, l0_absent) - sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
    FidlStructElement::Field(
        &struct_ptr_level_0_struct_pointer,
        offsetof(nested_struct_ptrs_inline_data, l0_present) - sizeof(fidl_message_header_t),
        kFidlIsResource_NotResource),
};
const FidlCodedStruct nested_struct_ptrs_message_type = {
    .tag = kFidlTypeStruct,
    .element_count = ArrayCount(nested_struct_ptrs_fields),
    .size_v2 = sizeof(nested_struct_ptrs_inline_data) - sizeof(fidl_message_header_t),
    .elements = nested_struct_ptrs_fields,
    .name = "nested_struct_ptrs_message",
};
