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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_arrays::StructSmallArray>::Format(std::ostream& os, const ::test_arrays::StructSmallArray& value) {
  os << "test_arrays::StructSmallArray";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<::std::array<uint32_t, 2>>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_arrays::StructLargeArray>::Format(std::ostream& os, const ::test_arrays::StructLargeArray& value) {
  os << "test_arrays::StructLargeArray";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<::std::array<uint32_t, 100>>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_arrays::TableSmallArray>::Format(std::ostream& os, const ::test_arrays::TableSmallArray& value) {
  os << "test_arrays::TableSmallArray";
  os << "{ ";
  if (value.a().has_value()) {
    os << "a";
    os << " = " << fidl::ostream::Formatted<::std::array<uint32_t, 2>>(value.a().value()) << ", ";
  }
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_arrays::TableLargeArray>::Format(std::ostream& os, const ::test_arrays::TableLargeArray& value) {
  os << "test_arrays::TableLargeArray";
  os << "{ ";
  if (value.a().has_value()) {
    os << "a";
    os << " = " << fidl::ostream::Formatted<::std::array<uint32_t, 100>>(value.a().value()) << ", ";
  }
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_arrays::UnionSmallArray>::Format(std::ostream& os, const ::test_arrays::UnionSmallArray& value) {
  os << "test_arrays::UnionSmallArray::";
  switch (value.Which()) {
    case ::test_arrays::UnionSmallArray::Tag::kA:
      os << "a(" << fidl::ostream::Formatted<::std::array<uint32_t, 2>>(value.a().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_arrays::UnionLargeArray>::Format(std::ostream& os, const ::test_arrays::UnionLargeArray& value) {
  os << "test_arrays::UnionLargeArray::";
  switch (value.Which()) {
    case ::test_arrays::UnionLargeArray::Tag::kA:
      os << "a(" << fidl::ostream::Formatted<::std::array<uint32_t, 100>>(value.a().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_arrays {

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

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

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

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

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

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

#pragma clang diagnostic pop

}  // namespace test_arrays
