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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_drivertwoway::TwoWayAddRequest> {
  using HLCPPType = ::test::drivertwoway::TwoWayAddRequest;
  static inline ::test::drivertwoway::TwoWayAddRequest Convert(::test_drivertwoway::TwoWayAddRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::drivertwoway::TwoWayAddRequest> {
  using NaturalType = ::test_drivertwoway::TwoWayAddRequest;
  static inline ::test_drivertwoway::TwoWayAddRequest Convert(::test::drivertwoway::TwoWayAddRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_drivertwoway::TwoWayAddResponse> {
  using HLCPPType = ::test::drivertwoway::TwoWayAddResponse;
  static inline ::test::drivertwoway::TwoWayAddResponse Convert(::test_drivertwoway::TwoWayAddResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::drivertwoway::TwoWayAddResponse> {
  using NaturalType = ::test_drivertwoway::TwoWayAddResponse;
  static inline ::test_drivertwoway::TwoWayAddResponse Convert(::test::drivertwoway::TwoWayAddResponse&&);
};

::test::drivertwoway::TwoWayAddRequest NaturalToHLCPPTraits<::test_drivertwoway::TwoWayAddRequest>::Convert(::test_drivertwoway::TwoWayAddRequest&& value) {
  ::test::drivertwoway::TwoWayAddRequest hlcpp;
  hlcpp.addend1 = ::fidl::NaturalToHLCPP(std::move(value.addend1()));
  hlcpp.addend2 = ::fidl::NaturalToHLCPP(std::move(value.addend2()));
  return hlcpp;
}

::test_drivertwoway::TwoWayAddRequest HLCPPToNaturalTraits<::test::drivertwoway::TwoWayAddRequest>::Convert(::test::drivertwoway::TwoWayAddRequest&& value) {
  return ::test_drivertwoway::TwoWayAddRequest{{
      .addend1 = ::fidl::HLCPPToNatural(std::move(value.addend1)),
      .addend2 = ::fidl::HLCPPToNatural(std::move(value.addend2)),
  }};
}
::test::drivertwoway::TwoWayAddResponse NaturalToHLCPPTraits<::test_drivertwoway::TwoWayAddResponse>::Convert(::test_drivertwoway::TwoWayAddResponse&& value) {
  ::test::drivertwoway::TwoWayAddResponse hlcpp;
  hlcpp.sum = ::fidl::NaturalToHLCPP(std::move(value.sum()));
  return hlcpp;
}

::test_drivertwoway::TwoWayAddResponse HLCPPToNaturalTraits<::test::drivertwoway::TwoWayAddResponse>::Convert(::test::drivertwoway::TwoWayAddResponse&& value) {
  return ::test_drivertwoway::TwoWayAddResponse{{
      .sum = ::fidl::HLCPPToNatural(std::move(value.sum)),
  }};
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
