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

// fidl_experiment = output_index_json

#pragma once

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

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

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)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
