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

// fidl_experiment = output_index_json

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

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

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocolrequest::ParentGetChildResponse>::Format(std::ostream& os, const ::test_protocolrequest::ParentGetChildResponse& value) {
  os << "test_protocolrequest::ParentGetChildResponse";
  os << "{ ";
  os << "c";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocolrequest::Child>>(value.c()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocolrequest::ParentGetChildRequestResponse>::Format(std::ostream& os, const ::test_protocolrequest::ParentGetChildRequestResponse& value) {
  os << "test_protocolrequest::ParentGetChildRequestResponse";
  os << "{ ";
  os << "r";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocolrequest::Child>>(value.r()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocolrequest::ParentTakeChildRequest>::Format(std::ostream& os, const ::test_protocolrequest::ParentTakeChildRequest& value) {
  os << "test_protocolrequest::ParentTakeChildRequest";
  os << "{ ";
  os << "c";
  os << " = " << fidl::ostream::Formatted<::fidl::ClientEnd<::test_protocolrequest::Child>>(value.c()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_protocolrequest::ParentTakeChildRequestRequest>::Format(std::ostream& os, const ::test_protocolrequest::ParentTakeChildRequestRequest& value) {
  os << "test_protocolrequest::ParentTakeChildRequestRequest";
  os << "{ ";
  os << "r";
  os << " = " << fidl::ostream::Formatted<::fidl::ServerEnd<::test_protocolrequest::Child>>(value.r()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

namespace test_protocolrequest {

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop

}  // namespace test_protocolrequest
