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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.struct/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <test/struct/cpp/fidl.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_struct::Simple> {
  using HLCPPType = ::test::struct_::Simple;
  static inline ::test::struct_::Simple Convert(::test_struct::Simple&&);
};
template <>
struct HLCPPToNaturalTraits<::test::struct_::Simple> {
  using NaturalType = ::test_struct::Simple;
  static inline ::test_struct::Simple Convert(::test::struct_::Simple&&);
};
template <>
struct NaturalToHLCPPTraits<::test_struct::BasicStruct> {
  using HLCPPType = ::test::struct_::BasicStruct;
  static inline ::test::struct_::BasicStruct Convert(::test_struct::BasicStruct&&);
};
template <>
struct HLCPPToNaturalTraits<::test::struct_::BasicStruct> {
  using NaturalType = ::test_struct::BasicStruct;
  static inline ::test_struct::BasicStruct Convert(::test::struct_::BasicStruct&&);
};

::test::struct_::Simple NaturalToHLCPPTraits<::test_struct::Simple>::Convert(::test_struct::Simple&& value) {
  ::test::struct_::Simple hlcpp;
  hlcpp.f1 = ::fidl::NaturalToHLCPP(std::move(value.f1()));
  hlcpp.f2 = ::fidl::NaturalToHLCPP(std::move(value.f2()));
  return hlcpp;
}

::test_struct::Simple HLCPPToNaturalTraits<::test::struct_::Simple>::Convert(::test::struct_::Simple&& value) {
  return ::test_struct::Simple{{
      .f1 = ::fidl::HLCPPToNatural(std::move(value.f1)),
      .f2 = ::fidl::HLCPPToNatural(std::move(value.f2)),
  }};
}
::test::struct_::BasicStruct NaturalToHLCPPTraits<::test_struct::BasicStruct>::Convert(::test_struct::BasicStruct&& value) {
  ::test::struct_::BasicStruct hlcpp;
  hlcpp.x = ::fidl::NaturalToHLCPP(std::move(value.x()));
  hlcpp.y = ::fidl::NaturalToHLCPP(std::move(value.y()));
  return hlcpp;
}

::test_struct::BasicStruct HLCPPToNaturalTraits<::test::struct_::BasicStruct>::Convert(::test::struct_::BasicStruct&& value) {
  return ::test_struct::BasicStruct{{
      .x = ::fidl::HLCPPToNatural(std::move(value.x)),
      .y = ::fidl::HLCPPToNatural(std::move(value.y)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
