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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_aliases::ObjType> : public NaturalToHLCPPTraitsEnum<::test_aliases::ObjType, ::test::aliases::obj_type, uint32_t> {};
template <>
struct HLCPPToNaturalTraits<::test::aliases::obj_type> : public HLCPPToNaturalTraitsEnum<::test::aliases::obj_type, ::test_aliases::ObjType> {};

template <>
struct NaturalToHLCPPTraits<::test_aliases::ExampleOfUseOfAliases> {
  using HLCPPType = ::test::aliases::ExampleOfUseOfAliases;
  static inline ::test::aliases::ExampleOfUseOfAliases Convert(::test_aliases::ExampleOfUseOfAliases&&);
};
template <>
struct HLCPPToNaturalTraits<::test::aliases::ExampleOfUseOfAliases> {
  using NaturalType = ::test_aliases::ExampleOfUseOfAliases;
  static inline ::test_aliases::ExampleOfUseOfAliases Convert(::test::aliases::ExampleOfUseOfAliases&&);
};

::test::aliases::ExampleOfUseOfAliases NaturalToHLCPPTraits<::test_aliases::ExampleOfUseOfAliases>::Convert(::test_aliases::ExampleOfUseOfAliases&& value) {
  ::test::aliases::ExampleOfUseOfAliases hlcpp;
  hlcpp.field_of_u32 = ::fidl::NaturalToHLCPP(std::move(value.field_of_u32()));
  hlcpp.field_of_vec_of_strings = ::fidl::NaturalToHLCPP(std::move(value.field_of_vec_of_strings()));
  hlcpp.field_of_vec_of_strings_at_most_nine = ::fidl::NaturalToHLCPP(std::move(value.field_of_vec_of_strings_at_most_nine()));
  hlcpp.field_of_vec_of_strings_at_most_5 = ::fidl::NaturalToHLCPP(std::move(value.field_of_vec_of_strings_at_most_5()));
  hlcpp.field_of_vec_of_ref_me_at_most_5 = ::fidl::NaturalToHLCPP(std::move(value.field_of_vec_of_ref_me_at_most_5()));
  hlcpp.field_of_channel = ::fidl::NaturalToHLCPP(std::move(value.field_of_channel()));
  hlcpp.field_of_client_end = ::fidl::NaturalToHLCPP(std::move(value.field_of_client_end()));
  hlcpp.field_of_nullable_client_end = ::fidl::NaturalToHLCPP(std::move(value.field_of_nullable_client_end()));
  return hlcpp;
}

::test_aliases::ExampleOfUseOfAliases HLCPPToNaturalTraits<::test::aliases::ExampleOfUseOfAliases>::Convert(::test::aliases::ExampleOfUseOfAliases&& value) {
  return ::test_aliases::ExampleOfUseOfAliases{{
      .field_of_u32 = ::fidl::HLCPPToNatural(std::move(value.field_of_u32)),
      .field_of_vec_of_strings = ::fidl::HLCPPToNatural(std::move(value.field_of_vec_of_strings)),
      .field_of_vec_of_strings_at_most_nine = ::fidl::HLCPPToNatural(std::move(value.field_of_vec_of_strings_at_most_nine)),
      .field_of_vec_of_strings_at_most_5 = ::fidl::HLCPPToNatural(std::move(value.field_of_vec_of_strings_at_most_5)),
      .field_of_vec_of_ref_me_at_most_5 = ::fidl::HLCPPToNatural(std::move(value.field_of_vec_of_ref_me_at_most_5)),
      .field_of_channel = ::fidl::HLCPPToNatural(std::move(value.field_of_channel)),
      .field_of_client_end = ::fidl::HLCPPToNatural(std::move(value.field_of_client_end)),
      .field_of_nullable_client_end = ::fidl::HLCPPToNatural(std::move(value.field_of_nullable_client_end)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
