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

#pragma once

#include <fidl/test/requestflexibleenvelope/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 StrictFoo = ::fidl::test::requestflexibleenvelope::StrictFoo;
using FlexibleFoo = ::fidl::test::requestflexibleenvelope::FlexibleFoo;

template <>
struct MinSize<StrictFoo> {
  operator size_t() {
    size_t sizes[] = {0, MinSize<::std::string>(), MinSize<int32_t>()};
    return 1 + *std::max_element(sizes, sizes + 2 + 1);
  }
};
template <>
struct Allocate<StrictFoo> {
  static_assert(2 > 0, "xunion must have at least one member");

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

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

    StrictFoo out;
    switch (selector % 2) {
      case 0: {
        out.set_s(Allocate<::std::string>{}(src, size));
        break;
      }
      case 1: {
        out.set_i(Allocate<int32_t>{}(src, size));
        break;
      }
    }

    return out;
  }
};
template <>
struct MinSize<FlexibleFoo> {
  operator size_t() {
    size_t sizes[] = {0, MinSize<::std::string>(), MinSize<int32_t>()};
    return 1 + *std::max_element(sizes, sizes + 2 + 1);
  }
};
template <>
struct Allocate<FlexibleFoo> {
  static_assert(2 > 0, "xunion must have at least one member");

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

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

    FlexibleFoo out;
    switch (selector % 2) {
      case 0: {
        out.set_s(Allocate<::std::string>{}(src, size));
        break;
      }
      case 1: {
        out.set_i(Allocate<int32_t>{}(src, size));
        break;
      }
    }

    return out;
  }
};

}  // namespace fuzzing
