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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_driveroneway::Payload> {
  using HLCPPType = ::test::driveroneway::Payload;
  static inline ::test::driveroneway::Payload Convert(::test_driveroneway::Payload&&);
};
template <>
struct HLCPPToNaturalTraits<::test::driveroneway::Payload> {
  using NaturalType = ::test_driveroneway::Payload;
  static inline ::test_driveroneway::Payload Convert(::test::driveroneway::Payload&&);
};
template <>
struct NaturalToHLCPPTraits<::test_driveroneway::OneWaySendRequest> {
  using HLCPPType = ::test::driveroneway::OneWaySendRequest;
  static inline ::test::driveroneway::OneWaySendRequest Convert(::test_driveroneway::OneWaySendRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::driveroneway::OneWaySendRequest> {
  using NaturalType = ::test_driveroneway::OneWaySendRequest;
  static inline ::test_driveroneway::OneWaySendRequest Convert(::test::driveroneway::OneWaySendRequest&&);
};

::test::driveroneway::Payload NaturalToHLCPPTraits<::test_driveroneway::Payload>::Convert(::test_driveroneway::Payload&& value) {
  ::test::driveroneway::Payload hlcpp;
  hlcpp.value = ::fidl::NaturalToHLCPP(std::move(value.value()));
  return hlcpp;
}

::test_driveroneway::Payload HLCPPToNaturalTraits<::test::driveroneway::Payload>::Convert(::test::driveroneway::Payload&& value) {
  return ::test_driveroneway::Payload{{
      .value = ::fidl::HLCPPToNatural(std::move(value.value)),
  }};
}
::test::driveroneway::OneWaySendRequest NaturalToHLCPPTraits<::test_driveroneway::OneWaySendRequest>::Convert(::test_driveroneway::OneWaySendRequest&& value) {
  ::test::driveroneway::OneWaySendRequest hlcpp;
  hlcpp.payload = ::fidl::NaturalToHLCPP(std::move(value.payload()));
  return hlcpp;
}

::test_driveroneway::OneWaySendRequest HLCPPToNaturalTraits<::test::driveroneway::OneWaySendRequest>::Convert(::test::driveroneway::OneWaySendRequest&& value) {
  return ::test_driveroneway::OneWaySendRequest{{
      .payload = ::fidl::HLCPPToNatural(std::move(value.payload)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
