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

#pragma once

#include <fidl/test.dependent/cpp/hlcpp_conversion.h>
#include <fidl/test.structdefaultvalueenumlibraryreference/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/llcpp/internal/transport_channel.h>
#include <test/structdefaultvalueenumlibraryreference/cpp/fidl.h>
namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_structdefaultvalueenumlibraryreference::Foo> {
  using HLCPPType = ::test::structdefaultvalueenumlibraryreference::Foo;
  static inline ::test::structdefaultvalueenumlibraryreference::Foo Convert(::test_structdefaultvalueenumlibraryreference::Foo&&);
};
template <>
struct HLCPPToNaturalTraits<::test::structdefaultvalueenumlibraryreference::Foo> {
  using NaturalType = ::test_structdefaultvalueenumlibraryreference::Foo;
  static inline ::test_structdefaultvalueenumlibraryreference::Foo Convert(::test::structdefaultvalueenumlibraryreference::Foo&&);
};

::test::structdefaultvalueenumlibraryreference::Foo NaturalToHLCPPTraits<::test_structdefaultvalueenumlibraryreference::Foo>::Convert(::test_structdefaultvalueenumlibraryreference::Foo&& value) {
  ::test::structdefaultvalueenumlibraryreference::Foo hlcpp;
  hlcpp.field = ::fidl::NaturalToHLCPP(std::move(value.field()));
  return hlcpp;
}

::test_structdefaultvalueenumlibraryreference::Foo HLCPPToNaturalTraits<::test::structdefaultvalueenumlibraryreference::Foo>::Convert(::test::structdefaultvalueenumlibraryreference::Foo&& value) {
  return ::test_structdefaultvalueenumlibraryreference::Foo{{
      .field = ::fidl::HLCPPToNatural(std::move(value.field)),
  }};
}

}  // namespace internal
}  // namespace fidl
