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

#pragma once

#include <fidl/test.drivertwoway/cpp/markers.h>
#include <fidl/test.drivertwoway/cpp/natural_types.h>
#include <fidl/test.drivertwoway/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.drivertwoway/cpp/natural_messaging.h>
#include <fidl/test.drivertwoway/cpp/wire_messaging.h>
#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

namespace fidl {
namespace internal {

template <>
struct WireNaturalConversionTraits<
    ::test_drivertwoway::wire::TwoWayAddTopResponse,
    ::test_drivertwoway::TwoWayAddTopResponse> {
  static ::test_drivertwoway::TwoWayAddTopResponse ToNatural(
      ::test_drivertwoway::wire::TwoWayAddTopResponse src);
  static ::test_drivertwoway::wire::TwoWayAddTopResponse ToWire(
      fidl::AnyArena& arena, ::test_drivertwoway::TwoWayAddTopResponse src);
};

template <>
struct NaturalTypeForWireType<::test_drivertwoway::wire::TwoWayAddTopResponse> {
  using type = ::test_drivertwoway::TwoWayAddTopResponse;
};
template <>
struct WireTypeForNaturalType<::test_drivertwoway::TwoWayAddTopResponse> {
  using type = ::test_drivertwoway::wire::TwoWayAddTopResponse;
};

template <>
struct WireNaturalConversionTraits<::test_drivertwoway::wire::TwoWayAddRequest,
                                   ::test_drivertwoway::TwoWayAddRequest> {
  static ::test_drivertwoway::TwoWayAddRequest ToNatural(
      ::test_drivertwoway::wire::TwoWayAddRequest src);
  static ::test_drivertwoway::wire::TwoWayAddRequest ToWire(
      fidl::AnyArena& arena, ::test_drivertwoway::TwoWayAddRequest src);
};

template <>
struct NaturalTypeForWireType<::test_drivertwoway::wire::TwoWayAddRequest> {
  using type = ::test_drivertwoway::TwoWayAddRequest;
};
template <>
struct WireTypeForNaturalType<::test_drivertwoway::TwoWayAddRequest> {
  using type = ::test_drivertwoway::wire::TwoWayAddRequest;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
