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

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::fidl::Request<::test_transitivedependenciescompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_transitivedependenciescompose::Top::GetFoo>,
    ::fidl::Request<::test_transitivedependenciescompose::Top::GetFoo>>::
    ToNatural(
        ::fidl::WireRequest<::test_transitivedependenciescompose::Top::GetFoo>
            src) {
  return ::fidl::Request<::test_transitivedependenciescompose::Top::GetFoo>();
}
::fidl::WireRequest<::test_transitivedependenciescompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_transitivedependenciescompose::Top::GetFoo>,
    ::fidl::Request<::test_transitivedependenciescompose::Top::GetFoo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_transitivedependenciescompose::Top::GetFoo>
               src) {
  return ::fidl::WireRequest<
      ::test_transitivedependenciescompose::Top::GetFoo>();
}

::fidl::Response<::test_transitivedependenciescompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_transitivedependenciescompose::Top::GetFoo>,
    ::fidl::Response<::test_transitivedependenciescompose::Top::GetFoo>>::
    ToNatural(
        ::fidl::WireResponse<::test_transitivedependenciescompose::Top::GetFoo>
            src) {
  return ::fidl::Response<::test_transitivedependenciescompose::Top::GetFoo>(
      WireNaturalConversionTraits<
          ::test_bottom::wire::BottomGetFooTopResponse,
          ::test_bottom::BottomGetFooTopResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_transitivedependenciescompose::Top::GetFoo>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_transitivedependenciescompose::Top::GetFoo>,
    ::fidl::Response<::test_transitivedependenciescompose::Top::GetFoo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<::test_transitivedependenciescompose::Top::GetFoo>
               src) {
  return ::fidl::WireResponse<
      ::test_transitivedependenciescompose::Top::GetFoo>(
      WireNaturalConversionTraits<
          ::test_bottom::wire::BottomGetFooTopResponse,
          ::test_bottom::BottomGetFooTopResponse>::ToWire(arena,
                                                          std::move(src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
