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

// fidl_experiment = output_index_json

#include <fidl/test.protocols/cpp/natural_ostream.h>

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

std::ostream& fidl::ostream::Formatter<::test_protocols::ErrorEnum>::Format(std::ostream& os, const ::test_protocols::ErrorEnum& value) {
  os << "test_protocols::ErrorEnum";
  os << "::";
  switch (value) {
    case ::test_protocols::ErrorEnum::kErrFoo:
      os << "kErrFoo";
      break;
    case ::test_protocols::ErrorEnum::kErrBar:
      os << "kErrBar";
      break;
    default:
      os << "UNKNOWN(" << static_cast<uint32_t>(value) << ")";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseNoRequestWithResponseResponse>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseNoRequestWithResponseResponse& value) {
  os << "test_protocols::WithAndWithoutRequestResponseNoRequestWithResponseResponse";
  os << "{ ";
  os << "ret";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.ret()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestNoResponseRequest>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestNoResponseRequest& value) {
  os << "test_protocols::WithAndWithoutRequestResponseWithRequestNoResponseRequest";
  os << "{ ";
  os << "arg";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.arg()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestEmptyResponseRequest>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestEmptyResponseRequest& value) {
  os << "test_protocols::WithAndWithoutRequestResponseWithRequestEmptyResponseRequest";
  os << "{ ";
  os << "arg";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.arg()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseRequest>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseRequest& value) {
  os << "test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseRequest";
  os << "{ ";
  os << "arg";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.arg()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseResponse>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseResponse& value) {
  os << "test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseResponse";
  os << "{ ";
  os << "ret";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.ret()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseOnWithResponseRequest>::Format(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseOnWithResponseRequest& value) {
  os << "test_protocols::WithAndWithoutRequestResponseOnWithResponseRequest";
  os << "{ ";
  os << "ret";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.ret()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxResponseAsStructResponse>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxResponseAsStructResponse& value) {
  os << "test_protocols::WithErrorSyntaxResponseAsStructResponse";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.b()) << ", ";
  os << "c";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.c()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse& value) {
  os << "test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse";
  os << "{ ";
  os << "__reserved";
  os << " = " << fidl::ostream::Formatted<uint8_t>(value.__reserved()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsEnumResponse>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsEnumResponse& value) {
  os << "test_protocols::WithErrorSyntaxErrorAsEnumResponse";
  os << "{ ";
  os << "__reserved";
  os << " = " << fidl::ostream::Formatted<uint8_t>(value.__reserved()) << ", ";
  os << "}";
  return os;
}
#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxHandleInResultResponse>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxHandleInResultResponse& value) {
  os << "test_protocols::WithErrorSyntaxHandleInResultResponse";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::handle>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodARequest>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolMethodARequest& value) {
  os << "test_protocols::ChannelProtocolMethodARequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolEventARequest>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolEventARequest& value) {
  os << "test_protocols::ChannelProtocolEventARequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodBRequest>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolMethodBRequest& value) {
  os << "test_protocols::ChannelProtocolMethodBRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodBResponse>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolMethodBResponse& value) {
  os << "test_protocols::ChannelProtocolMethodBResponse";
  os << "{ ";
  os << "result";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.result()) << ", ";
  os << "}";
  return os;
}
#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolTakeHandleRequest>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolTakeHandleRequest& value) {
  os << "test_protocols::ChannelProtocolTakeHandleRequest";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::handle>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolMutateSocketRequest>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolMutateSocketRequest& value) {
  os << "test_protocols::ChannelProtocolMutateSocketRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.a()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ChannelProtocolMutateSocketResponse>::Format(std::ostream& os, const ::test_protocols::ChannelProtocolMutateSocketResponse& value) {
  os << "test_protocols::ChannelProtocolMutateSocketResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.b()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::SyscallProtocolMethodCRequest>::Format(std::ostream& os, const ::test_protocols::SyscallProtocolMethodCRequest& value) {
  os << "test_protocols::SyscallProtocolMethodCRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.b()) << ", ";
  os << "}";
  return os;
}
#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolNoResponseMethodRequest>::Format(std::ostream& os, const ::test_protocols::HandleRightsProtocolNoResponseMethodRequest& value) {
  os << "test_protocols::HandleRightsProtocolNoResponseMethodRequest";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolResponseMethodRequest>::Format(std::ostream& os, const ::test_protocols::HandleRightsProtocolResponseMethodRequest& value) {
  os << "test_protocols::HandleRightsProtocolResponseMethodRequest";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolResponseMethodResponse>::Format(std::ostream& os, const ::test_protocols::HandleRightsProtocolResponseMethodResponse& value) {
  os << "test_protocols::HandleRightsProtocolResponseMethodResponse";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolAnEventRequest>::Format(std::ostream& os, const ::test_protocols::HandleRightsProtocolAnEventRequest& value) {
  os << "test_protocols::HandleRightsProtocolAnEventRequest";
  os << "{ ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::socket>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ProtocolEnds>::Format(std::ostream& os, const ::test_protocols::ProtocolEnds& value) {
  os << "test_protocols::ProtocolEnds";
  os << "{ ";
  os << "client";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocols::DiscoverableProtocol>>(value.client()) << ", ";
  os << "server";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocols::DiscoverableProtocol>>(value.server()) << ", ";
  os << "client_opt";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocols::DiscoverableProtocol>>(value.client_opt()) << ", ";
  os << "server_opt";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocols::DiscoverableProtocol>>(value.server_opt()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsClientEndsRequest>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsClientEndsRequest& value) {
  os << "test_protocols::WithProtocolEndsClientEndsRequest";
  os << "{ ";
  os << "in";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocols::DiscoverableProtocol>>(value.in()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsClientEndsResponse>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsClientEndsResponse& value) {
  os << "test_protocols::WithProtocolEndsClientEndsResponse";
  os << "{ ";
  os << "out";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocols::DiscoverableProtocol>>(value.out()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsServerEndsRequest>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsServerEndsRequest& value) {
  os << "test_protocols::WithProtocolEndsServerEndsRequest";
  os << "{ ";
  os << "in";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocols::DiscoverableProtocol>>(value.in()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsServerEndsResponse>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsServerEndsResponse& value) {
  os << "test_protocols::WithProtocolEndsServerEndsResponse";
  os << "{ ";
  os << "out";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocols::DiscoverableProtocol>>(value.out()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsStructContainingEndsRequest>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsStructContainingEndsRequest& value) {
  os << "test_protocols::WithProtocolEndsStructContainingEndsRequest";
  os << "{ ";
  os << "in";
  os << " = " << fidl::ostream::Formatted<::test_protocols::ProtocolEnds>(value.in()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithProtocolEndsStructContainingEndsResponse>::Format(std::ostream& os, const ::test_protocols::WithProtocolEndsStructContainingEndsResponse& value) {
  os << "test_protocols::WithProtocolEndsStructContainingEndsResponse";
  os << "{ ";
  os << "out";
  os << " = " << fidl::ostream::Formatted<::test_protocols::ProtocolEnds>(value.out()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::ManyParametersFifteenRequest>::Format(std::ostream& os, const ::test_protocols::ManyParametersFifteenRequest& value) {
  os << "test_protocols::ManyParametersFifteenRequest";
  os << "{ ";
  os << "p1";
  os << " = " << fidl::ostream::Formatted<bool>(value.p1()) << ", ";
  os << "p2";
  os << " = " << fidl::ostream::Formatted<bool>(value.p2()) << ", ";
  os << "p3";
  os << " = " << fidl::ostream::Formatted<bool>(value.p3()) << ", ";
  os << "p4";
  os << " = " << fidl::ostream::Formatted<bool>(value.p4()) << ", ";
  os << "p5";
  os << " = " << fidl::ostream::Formatted<bool>(value.p5()) << ", ";
  os << "p6";
  os << " = " << fidl::ostream::Formatted<bool>(value.p6()) << ", ";
  os << "p7";
  os << " = " << fidl::ostream::Formatted<bool>(value.p7()) << ", ";
  os << "p8";
  os << " = " << fidl::ostream::Formatted<bool>(value.p8()) << ", ";
  os << "p9";
  os << " = " << fidl::ostream::Formatted<bool>(value.p9()) << ", ";
  os << "p10";
  os << " = " << fidl::ostream::Formatted<bool>(value.p10()) << ", ";
  os << "p11";
  os << " = " << fidl::ostream::Formatted<bool>(value.p11()) << ", ";
  os << "p12";
  os << " = " << fidl::ostream::Formatted<bool>(value.p12()) << ", ";
  os << "p13";
  os << " = " << fidl::ostream::Formatted<bool>(value.p13()) << ", ";
  os << "p14";
  os << " = " << fidl::ostream::Formatted<bool>(value.p14()) << ", ";
  os << "p15";
  os << " = " << fidl::ostream::Formatted<bool>(value.p15()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::MethodWithUnionUnionMethodRequest>::Format(std::ostream& os, const ::test_protocols::MethodWithUnionUnionMethodRequest& value) {
  os << "test_protocols::MethodWithUnionUnionMethodRequest";
  os << "{ ";
  os << "u";
  os << " = " << fidl::ostream::Formatted<::test_protocols::TheUnion>(value.u()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::MethodWithUnionUnionMethodResponse>::Format(std::ostream& os, const ::test_protocols::MethodWithUnionUnionMethodResponse& value) {
  os << "test_protocols::MethodWithUnionUnionMethodResponse";
  os << "{ ";
  os << "u";
  os << " = " << fidl::ostream::Formatted<::fidl::Box<::test_protocols::TheUnion>>(value.u()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxResponseAsStructResult>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxResponseAsStructResult& value) {
  os << "test_protocols::WithErrorSyntaxResponseAsStructResult::";
  switch (value.Which()) {
    case ::test_protocols::WithErrorSyntaxResponseAsStructResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_protocols::WithErrorSyntaxResponseAsStructResponse>(value.response().value()) << ")";
      break;
    case ::test_protocols::WithErrorSyntaxResponseAsStructResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult& value) {
  os << "test_protocols::WithErrorSyntaxErrorAsPrimitiveResult::";
  switch (value.Which()) {
    case ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse>(value.response().value()) << ")";
      break;
    case ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsEnumResult>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsEnumResult& value) {
  os << "test_protocols::WithErrorSyntaxErrorAsEnumResult::";
  switch (value.Which()) {
    case ::test_protocols::WithErrorSyntaxErrorAsEnumResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_protocols::WithErrorSyntaxErrorAsEnumResponse>(value.response().value()) << ")";
      break;
    case ::test_protocols::WithErrorSyntaxErrorAsEnumResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<::test_protocols::ErrorEnum>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxHandleInResultResult>::Format(std::ostream& os, const ::test_protocols::WithErrorSyntaxHandleInResultResult& value) {
  os << "test_protocols::WithErrorSyntaxHandleInResultResult::";
  switch (value.Which()) {
    case ::test_protocols::WithErrorSyntaxHandleInResultResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_protocols::WithErrorSyntaxHandleInResultResponse>(value.response().value()) << ")";
      break;
    case ::test_protocols::WithErrorSyntaxHandleInResultResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

#endif  // __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocols::TheUnion>::Format(std::ostream& os, const ::test_protocols::TheUnion& value) {
  os << "test_protocols::TheUnion::";
  switch (value.Which()) {
    case ::test_protocols::TheUnion::Tag::kV:
      os << "v(" << fidl::ostream::Formatted<uint32_t>(value.v().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_protocols {

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseNoRequestWithResponseResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseNoRequestWithResponseResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestNoResponseRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestNoResponseRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestEmptyResponseRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestEmptyResponseRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseWithRequestWithResponseResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithAndWithoutRequestResponseOnWithResponseRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithAndWithoutRequestResponseOnWithResponseRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ErrorEnum& value) {
  return fidl::ostream::Formatter<::test_protocols::ErrorEnum>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxResponseAsStructResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxResponseAsStructResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxResponseAsStructResult& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxResponseAsStructResult>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsPrimitiveResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsPrimitiveResult>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsEnumResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsEnumResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxErrorAsEnumResult& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxErrorAsEnumResult>::Format(os, value);
}

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxHandleInResultResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxHandleInResultResponse>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithErrorSyntaxHandleInResultResult& value) {
  return fidl::ostream::Formatter<::test_protocols::WithErrorSyntaxHandleInResultResult>::Format(os, value);
}

#endif  // __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolMethodARequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodARequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolEventARequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolEventARequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolMethodBRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodBRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolMethodBResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolMethodBResponse>::Format(os, value);
}

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolTakeHandleRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolTakeHandleRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolMutateSocketRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolMutateSocketRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ChannelProtocolMutateSocketResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::ChannelProtocolMutateSocketResponse>::Format(os, value);
}

#endif  // __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::SyscallProtocolMethodCRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::SyscallProtocolMethodCRequest>::Format(os, value);
}

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::HandleRightsProtocolNoResponseMethodRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolNoResponseMethodRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::HandleRightsProtocolResponseMethodRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolResponseMethodRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::HandleRightsProtocolResponseMethodResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolResponseMethodResponse>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::HandleRightsProtocolAnEventRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::HandleRightsProtocolAnEventRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ProtocolEnds& value) {
  return fidl::ostream::Formatter<::test_protocols::ProtocolEnds>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsClientEndsRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsClientEndsRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsClientEndsResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsClientEndsResponse>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsServerEndsRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsServerEndsRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsServerEndsResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsServerEndsResponse>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsStructContainingEndsRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsStructContainingEndsRequest>::Format(os, value);
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::WithProtocolEndsStructContainingEndsResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::WithProtocolEndsStructContainingEndsResponse>::Format(os, value);
}

#endif  // __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_protocols::ManyParametersFifteenRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::ManyParametersFifteenRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::TheUnion& value) {
  return fidl::ostream::Formatter<::test_protocols::TheUnion>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::MethodWithUnionUnionMethodRequest& value) {
  return fidl::ostream::Formatter<::test_protocols::MethodWithUnionUnionMethodRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_protocols::MethodWithUnionUnionMethodResponse& value) {
  return fidl::ostream::Formatter<::test_protocols::MethodWithUnionUnionMethodResponse>::Format(os, value);
}

#pragma clang diagnostic pop

}  // namespace test_protocols
