// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include <test/inheritancewithrecursivedecl/cpp/fidl.h>

#include "lib/fidl/cpp/fuzzing/traits.h"
#include "lib/fidl/cpp/internal/header.h"
// For ::std::max_element().
#include <algorithm>
// For uint64_t.
#include <stdint.h>

namespace fuzzing {

using ParentFirstRequest = ::test::inheritancewithrecursivedecl::ParentFirstRequest;
using ChildSecondRequest = ::test::inheritancewithrecursivedecl::ChildSecondRequest;

template <>
struct MinSize<ParentFirstRequest> {
  operator size_t() {
    return MinSize<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>();
  }
};
template <>
struct Allocate<ParentFirstRequest> {
  ParentFirstRequest operator()(FuzzInput* src, size_t* size) {
    ZX_ASSERT(*size >= MinSize<ParentFirstRequest>());
    ParentFirstRequest out;
    const size_t slack_per_member = (*size - MinSize<ParentFirstRequest>()) / 1;
    size_t out_size;
    out_size = MinSize<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>() + slack_per_member;
    out.request = Allocate<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>{}(src, &out_size);
    return out;
  }
};
template <>
struct MinSize<ChildSecondRequest> {
  operator size_t() {
    return MinSize<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>();
  }
};
template <>
struct Allocate<ChildSecondRequest> {
  ChildSecondRequest operator()(FuzzInput* src, size_t* size) {
    ZX_ASSERT(*size >= MinSize<ChildSecondRequest>());
    ChildSecondRequest out;
    const size_t slack_per_member = (*size - MinSize<ChildSecondRequest>()) / 1;
    size_t out_size;
    out_size = MinSize<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>() + slack_per_member;
    out.request = Allocate<::fidl::InterfaceRequest<::test::inheritancewithrecursivedecl::Parent>>{}(src, &out_size);
    return out;
  }
};

}  // namespace fuzzing
