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

#pragma once

#include <fidl/test/error/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 Example_foo_Response = ::fidl::test::error::Example_foo_Response;
using Example_foo_Result = ::fidl::test::error::Example_foo_Result;

template <>
struct MinSize<Example_foo_Response> {
  operator size_t() { return MinSize<int64_t>(); }
};
template <>
struct Allocate<Example_foo_Response> {
  Example_foo_Response operator()(FuzzInput* src, size_t* size) {
    ZX_ASSERT(*size >= MinSize<Example_foo_Response>());
    Example_foo_Response out;
    const size_t slack_per_member =
        (*size - MinSize<Example_foo_Response>()) / 1;
    size_t out_size;
    out_size = MinSize<int64_t>() + slack_per_member;
    out.y = Allocate<int64_t>{}(src, &out_size);
    return out;
  }
};
template <>
struct MinSize<Example_foo_Result> {
  operator size_t() {
    size_t sizes[] = {0, MinSize<::fidl::test::error::Example_foo_Response>(),
                      MinSize<uint32_t>()};
    return 1 + *std::max_element(sizes, sizes + 2 + 1);
  }
};
template <>
struct Allocate<Example_foo_Result> {
  static_assert(2 > 0, "xunion must have at least one member");

  Example_foo_Result operator()(FuzzInput* src, size_t* size) {
    ZX_ASSERT(*size >= MinSize<Example_foo_Result>());

    uint8_t selector;
    ZX_ASSERT(src->CopyBytes(&selector, 1));
    (*size)++;

    Example_foo_Result out;
    switch (selector % 2) {
      case 0: {
        out.set_response(
            Allocate<::fidl::test::error::Example_foo_Response>{}(src, size));
        break;
      }
      case 1: {
        out.set_err(Allocate<uint32_t>{}(src, size));
        break;
      }
    }

    return out;
  }
};

}  // namespace fuzzing
