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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::Int8Int32>::Format(std::ostream& os, const ::test_encapsulatedstructs::Int8Int32& value) {
  os << "test_encapsulatedstructs::Int8Int32";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int8_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::Int16Int8>::Format(std::ostream& os, const ::test_encapsulatedstructs::Int16Int8& value) {
  os << "test_encapsulatedstructs::Int16Int8";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<int16_t>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int8_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::ArrayInt16Int8>::Format(std::ostream& os, const ::test_encapsulatedstructs::ArrayInt16Int8& value) {
  os << "test_encapsulatedstructs::ArrayInt16Int8";
  os << "{ ";
  os << "arr";
  os << " = " << fidl::ostream::Formatted<::std::array<::test_encapsulatedstructs::Int16Int8, 3>>(value.arr()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::StructPaddingTestStruct>::Format(std::ostream& os, const ::test_encapsulatedstructs::StructPaddingTestStruct& value) {
  os << "test_encapsulatedstructs::StructPaddingTestStruct";
  os << "{ ";
  os << "trailing";
  os << " = " << fidl::ostream::Formatted<::test_encapsulatedstructs::Int16Int8>(value.trailing()) << ", ";
  os << "inner";
  os << " = " << fidl::ostream::Formatted<::test_encapsulatedstructs::Int8Int32>(value.inner()) << ", ";
  os << "array";
  os << " = " << fidl::ostream::Formatted<::test_encapsulatedstructs::ArrayInt16Int8>(value.array()) << ", ";
  os << "}";
  return os;
}
#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::NonInlineStructTestStruct>::Format(std::ostream& os, const ::test_encapsulatedstructs::NonInlineStructTestStruct& value) {
  os << "test_encapsulatedstructs::NonInlineStructTestStruct";
  os << "{ ";
  os << "element";
  os << " = " << fidl::ostream::Formatted<::fidl::Box<::test_encapsulatedstructs::Int16Int8>>(value.element()) << ", ";
  os << "h";
  os << " = " << fidl::ostream::Formatted<::zx::handle>(value.h()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_encapsulatedstructs::TopLevelStruct>::Format(std::ostream& os, const ::test_encapsulatedstructs::TopLevelStruct& value) {
  os << "test_encapsulatedstructs::TopLevelStruct";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<::test_encapsulatedstructs::StructPaddingTestStruct>(value.a()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<::test_encapsulatedstructs::NonInlineStructTestStruct>(value.b()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

namespace test_encapsulatedstructs {

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

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

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

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

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop

}  // namespace test_encapsulatedstructs
