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

// This was machine generated with:
// bash$ fidlc --c-header trace_provider.fidl.h --tables trace_provider.fidl.cpp
//   --files system/fidl/tracelink/tracelink.fidl
// There are no differences with the machine generated version except the
// addition of this text (up to "End of additions ...").
// It is checked in to workaround these problems:
// - zircon's build system doesn't support transitive dependencies
// - duplicate copy of tracelink is generated and compiled in garnet
// - generated code for Interfaces is different than what we're using:
//   struct vs zx_handle_t

#include "trace_provider.fidl.h"

// End of additions to machine-generated file.
// WARNING: This file is machine generated by fidlc.

#include <lib/fidl/internal.h>

extern "C" {



static const fidl_type_t HandlevmononnullableTable = fidl_type_t(::fidl::FidlCodedHandle(ZX_OBJ_TYPE_VMO, ::fidl::kNonnullable));

static const fidl_type_t HandleeventpairnonnullableTable = fidl_type_t(::fidl::FidlCodedHandle(ZX_OBJ_TYPE_EVENTPAIR, ::fidl::kNonnullable));

static const fidl_type_t String100nonnullableTable = fidl_type_t(::fidl::FidlCodedString(100, ::fidl::kNonnullable));

static const fidl_type_t VectorString100nonnullable100nonnullableTable = fidl_type_t(::fidl::FidlCodedVector(&String100nonnullableTable, 100, 16, ::fidl::kNonnullable));

extern const fidl_type_t fuchsia_tracelink_ProviderStartRequestTable;
static const ::fidl::FidlField fuchsia_tracelink_ProviderStartRequestFields[] = {
    ::fidl::FidlField(&HandlevmononnullableTable, 16),
    ::fidl::FidlField(&HandleeventpairnonnullableTable, 20),
    ::fidl::FidlField(&VectorString100nonnullable100nonnullableTable, 24)
};
const fidl_type_t fuchsia_tracelink_ProviderStartRequestTable = fidl_type_t(::fidl::FidlCodedStruct(fuchsia_tracelink_ProviderStartRequestFields, 3, 40, ""));

extern const fidl_type_t fuchsia_tracelink_ProviderStopRequestTable;
static const ::fidl::FidlField fuchsia_tracelink_ProviderStopRequestFields[] = {};
const fidl_type_t fuchsia_tracelink_ProviderStopRequestTable = fidl_type_t(::fidl::FidlCodedStruct(fuchsia_tracelink_ProviderStopRequestFields, 0, 16, ""));

static const fidl_type_t fuchsia_tracelink_ProviderInterfacenonnullableTable = fidl_type_t(::fidl::FidlCodedHandle(ZX_OBJ_TYPE_CHANNEL, ::fidl::kNonnullable));

extern const fidl_type_t fuchsia_tracelink_RegistryRegisterTraceProviderRequestTable;
static const ::fidl::FidlField fuchsia_tracelink_RegistryRegisterTraceProviderRequestFields[] = {
    ::fidl::FidlField(&fuchsia_tracelink_ProviderInterfacenonnullableTable, 16)
};
const fidl_type_t fuchsia_tracelink_RegistryRegisterTraceProviderRequestTable = fidl_type_t(::fidl::FidlCodedStruct(fuchsia_tracelink_RegistryRegisterTraceProviderRequestFields, 1, 20, ""));

} // extern "C"
