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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_protocollayoutssamelibrary::ComposedProtocol>> {
  using HLCPPType = fidl::InterfaceHandle<::test::protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::InterfaceHandle<::test::protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::ClientEnd<::test_protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return fidl::InterfaceHandle<::test::protocollayoutssamelibrary::ComposedProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol>> {
  using HLCPPType = fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::protocollayoutssamelibrary::ComposedProtocol>> {
  using NaturalType = fidl::ClientEnd<::test_protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::ClientEnd<::test_protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::InterfaceHandle<::test::protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return fidl::ClientEnd<::test_protocollayoutssamelibrary::ComposedProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol>> {
  using NaturalType = fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_protocollayoutssamelibrary::ComposedProtocol>> {
  using HLCPPType = fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::ProtocolHandler<::test_protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return [c = std::move(c)](fidl::InterfaceRequest<::test::protocollayoutssamelibrary::ComposedProtocol> r) {
      c(::fidl::HLCPPToNatural(r));
    };
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::ComposedProtocol>> {
  using NaturalType = fidl::ProtocolHandler<::test_protocollayoutssamelibrary::ComposedProtocol>;
  static inline fidl::ProtocolHandler<::test_protocollayoutssamelibrary::ComposedProtocol> Convert(fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::ComposedProtocol>&& c) {
    return [c = std::move(c)](fidl::ServerEnd<::test_protocollayoutssamelibrary::ComposedProtocol> r) {
      c(::fidl::NaturalToHLCPP(r));
    };
  }
};
template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_protocollayoutssamelibrary::MainProtocol>> {
  using HLCPPType = fidl::InterfaceHandle<::test::protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::InterfaceHandle<::test::protocollayoutssamelibrary::MainProtocol> Convert(fidl::ClientEnd<::test_protocollayoutssamelibrary::MainProtocol>&& c) {
    return fidl::InterfaceHandle<::test::protocollayoutssamelibrary::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol>> {
  using HLCPPType = fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol> Convert(fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol>&& c) {
    return fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::protocollayoutssamelibrary::MainProtocol>> {
  using NaturalType = fidl::ClientEnd<::test_protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::ClientEnd<::test_protocollayoutssamelibrary::MainProtocol> Convert(fidl::InterfaceHandle<::test::protocollayoutssamelibrary::MainProtocol>&& c) {
    return fidl::ClientEnd<::test_protocollayoutssamelibrary::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol>> {
  using NaturalType = fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol> Convert(fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol>&& c) {
    return fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_protocollayoutssamelibrary::MainProtocol>> {
  using HLCPPType = fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::MainProtocol> Convert(fidl::ProtocolHandler<::test_protocollayoutssamelibrary::MainProtocol>&& c) {
    return [c = std::move(c)](fidl::InterfaceRequest<::test::protocollayoutssamelibrary::MainProtocol> r) {
      c(::fidl::HLCPPToNatural(r));
    };
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::MainProtocol>> {
  using NaturalType = fidl::ProtocolHandler<::test_protocollayoutssamelibrary::MainProtocol>;
  static inline fidl::ProtocolHandler<::test_protocollayoutssamelibrary::MainProtocol> Convert(fidl::InterfaceRequestHandler<::test::protocollayoutssamelibrary::MainProtocol>&& c) {
    return [c = std::move(c)](fidl::ServerEnd<::test_protocollayoutssamelibrary::MainProtocol> r) {
      c(::fidl::NaturalToHLCPP(r));
    };
  }
};

template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::TablePayload> {
  using HLCPPType = ::test::protocollayoutssamelibrary::TablePayload;
  static inline ::test::protocollayoutssamelibrary::TablePayload Convert(::test_protocollayoutssamelibrary::TablePayload&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::TablePayload> {
  using NaturalType = ::test_protocollayoutssamelibrary::TablePayload;
  static inline ::test_protocollayoutssamelibrary::TablePayload Convert(::test::protocollayoutssamelibrary::TablePayload&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest Convert(::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest Convert(::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest;
  static inline ::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest Convert(::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest;
  static inline ::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest Convert(::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse;
  static inline ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest;
  static inline ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::UnionPayload> {
  using HLCPPType = ::test::protocollayoutssamelibrary::UnionPayload;
  static inline ::test::protocollayoutssamelibrary::UnionPayload Convert(::test_protocollayoutssamelibrary::UnionPayload&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::UnionPayload> {
  using NaturalType = ::test_protocollayoutssamelibrary::UnionPayload;
  static inline ::test_protocollayoutssamelibrary::UnionPayload Convert(::test::protocollayoutssamelibrary::UnionPayload&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest Convert(::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest Convert(::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult> {
  using HLCPPType = ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result;
  static inline ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result> {
  using NaturalType = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;
  static inline ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result;
  static inline ::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest;
  static inline ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response;
  static inline ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result;
  static inline ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult;
  static inline ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result&&);
};
template <>
struct NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest> {
  using HLCPPType = ::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest;
  static inline ::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest Convert(::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest> {
  using NaturalType = ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest;
  static inline ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest Convert(::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest&&);
};

::test::protocollayoutssamelibrary::TablePayload NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::TablePayload>::Convert(::test_protocollayoutssamelibrary::TablePayload&& value) {
  ::test::protocollayoutssamelibrary::TablePayload hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::TablePayload HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::TablePayload>::Convert(::test::protocollayoutssamelibrary::TablePayload&& value) {
  ::test_protocollayoutssamelibrary::TablePayload natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest>::Convert(::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest&& value) {
  ::test_protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse>::Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse&& value) {
  ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedResponse natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest>::Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest&& value) {
  ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest>::Convert(::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest&& value) {
  ::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest>::Convert(::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest&& value) {
  ::test_protocollayoutssamelibrary::MainProtocolOneWayAnonRequest natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse&& value) {
  ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse>::Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse&& value) {
  ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonResponse natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}
::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest&& value) {
  ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest hlcpp;
  if (value.a().has_value()) {
    hlcpp.set_a(::fidl::NaturalToHLCPP(std::move(value.a().value())));
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest>::Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest&& value) {
  ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest natural;
  if (value.has_a()) {
    natural.a() = ::fidl::HLCPPToNatural(std::move(*value.mutable_a()));
  }
  return natural;
}

::test::protocollayoutssamelibrary::UnionPayload NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::UnionPayload>::Convert(::test_protocollayoutssamelibrary::UnionPayload&& value) {
  ::test::protocollayoutssamelibrary::UnionPayload hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::UnionPayload::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::UnionPayload HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::UnionPayload>::Convert(::test::protocollayoutssamelibrary::UnionPayload&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::UnionPayload;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::UnionPayload::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::UnionPayload");
  }
}
::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest>::Convert(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest");
  }
}
::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response>::Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResponse;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Response");
  }
}
::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result>::Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorResult;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayAnonComposedWithError_Result");
  }
}
::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest>::Convert(::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::ComposedProtocolOnAnonComposedRequest");
  }
}
::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult>::Convert(::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult&& value) {
  ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result>::Convert(::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::ComposedProtocolTwoWayNamedComposedWithErrorResult;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::ComposedProtocol_TwoWayNamedComposedWithError_Result");
  }
}
::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult&& value) {
  ::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result>::Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::MainProtocolTwoWayLocalWithErrorResult;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::MainProtocol_TwoWayLocalWithError_Result");
  }
}
::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest&& value) {
  ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest>::Convert(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse&& value) {
  ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response>::Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResponse;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Response::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult>::Convert(::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult&& value) {
  ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult::Tag::kResponse:
      hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
      break;
    case ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult::Tag::kErr:
      hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result>::Convert(::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorResult;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result::Tag::kResponse:
      return _NaturalUnion::WithResponse(
          ::fidl::HLCPPToNatural(std::move(value.response())));
    case ::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result::Tag::kErr:
      return _NaturalUnion::WithErr(
          ::fidl::HLCPPToNatural(std::move(value.err())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::protocollayoutssamelibrary::MainProtocol_TwoWayAnonWithError_Result");
  }
}
::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest NaturalToHLCPPTraits<::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest>::Convert(::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest&& value) {
  ::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest hlcpp;
  switch (value.Which()) {
    case ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest::Tag::kB:
      hlcpp.set_b(::fidl::NaturalToHLCPP(std::move(value.b().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest HLCPPToNaturalTraits<::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest>::Convert(::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest&& value) {
  using _NaturalUnion = ::test_protocollayoutssamelibrary::MainProtocolOnAnonRequest;
  switch (value.Which()) {
    case ::test::protocollayoutssamelibrary::MainProtocolOnAnonRequest::Tag::kB:
      return _NaturalUnion::WithB(
          ::fidl::HLCPPToNatural(std::move(value.b())));
    default:
      return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
