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

#pragma once

#include <fidl/test.vectors/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/llcpp/internal/transport_channel.h>
#include <test/vectors/cpp/fidl.h>

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_vectors::ExampleUseOfVectors> {
  using HLCPPType = ::test::vectors::ExampleUseOfVectors;
  static inline ::test::vectors::ExampleUseOfVectors Convert(::test_vectors::ExampleUseOfVectors&&);
};
template <>
struct HLCPPToNaturalTraits<::test::vectors::ExampleUseOfVectors> {
  using NaturalType = ::test_vectors::ExampleUseOfVectors;
  static inline ::test_vectors::ExampleUseOfVectors Convert(::test::vectors::ExampleUseOfVectors&&);
};

::test::vectors::ExampleUseOfVectors NaturalToHLCPPTraits<::test_vectors::ExampleUseOfVectors>::Convert(::test_vectors::ExampleUseOfVectors&& value) {
  ::test::vectors::ExampleUseOfVectors hlcpp;
  hlcpp.vector_of_uint8 = ::fidl::NaturalToHLCPP(std::move(value.vector_of_uint8()));
  hlcpp.vector_of_vector_of_bool = ::fidl::NaturalToHLCPP(std::move(value.vector_of_vector_of_bool()));
  return hlcpp;
}

::test_vectors::ExampleUseOfVectors HLCPPToNaturalTraits<::test::vectors::ExampleUseOfVectors>::Convert(::test::vectors::ExampleUseOfVectors&& value) {
  return ::test_vectors::ExampleUseOfVectors{{
      .vector_of_uint8 = ::fidl::HLCPPToNatural(std::move(value.vector_of_uint8)),
      .vector_of_vector_of_bool = ::fidl::HLCPPToNatural(std::move(value.vector_of_vector_of_bool)),
  }};
}

}  // namespace internal
}  // namespace fidl
