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

// fidl_experiment = output_index_json

#include <fidl/test.drivertwoway/cpp/type_conversions.h>

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

namespace fidl {
namespace internal {

::test_drivertwoway::TwoWayAddRequest WireNaturalConversionTraits<::test_drivertwoway::wire::TwoWayAddRequest, ::test_drivertwoway::TwoWayAddRequest>::ToNatural(::test_drivertwoway::wire::TwoWayAddRequest src) {
  return ::test_drivertwoway::TwoWayAddRequest{{
      .addend1 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToNatural(std::move(src.addend1)),
      .addend2 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToNatural(std::move(src.addend2)),
  }};
}
::test_drivertwoway::wire::TwoWayAddRequest WireNaturalConversionTraits<::test_drivertwoway::wire::TwoWayAddRequest, ::test_drivertwoway::TwoWayAddRequest>::ToWire(fidl::AnyArena& arena, ::test_drivertwoway::TwoWayAddRequest src) {
  return ::test_drivertwoway::wire::TwoWayAddRequest{
      .addend1 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToWire(arena, std::move(src.addend1())),
      .addend2 = WireNaturalConversionTraits<uint16_t, uint16_t>::ToWire(arena, std::move(src.addend2())),
  };
}

::test_drivertwoway::TwoWayAddResponse WireNaturalConversionTraits<::test_drivertwoway::wire::TwoWayAddResponse, ::test_drivertwoway::TwoWayAddResponse>::ToNatural(::test_drivertwoway::wire::TwoWayAddResponse src) {
  return ::test_drivertwoway::TwoWayAddResponse(WireNaturalConversionTraits<uint16_t, uint16_t>::ToNatural(std::move(src.sum)));
}
::test_drivertwoway::wire::TwoWayAddResponse WireNaturalConversionTraits<::test_drivertwoway::wire::TwoWayAddResponse, ::test_drivertwoway::TwoWayAddResponse>::ToWire(fidl::AnyArena& arena, ::test_drivertwoway::TwoWayAddResponse src) {
  return ::test_drivertwoway::wire::TwoWayAddResponse{
      .sum = WireNaturalConversionTraits<uint16_t, uint16_t>::ToWire(arena, std::move(src.sum())),
  };
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
