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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_versions::Enum>::Format(std::ostream& os, const ::test_versions::Enum& value) {
  os << "test_versions::Enum";
  os << "::";
  switch (value) {
    case ::test_versions::Enum::kA:
      os << "kA";
      break;
    default:
      os << "UNKNOWN(" << static_cast<uint32_t>(value) << ")";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_versions::Bits>::Format(std::ostream& os, const ::test_versions::Bits& value) {
  os << "test_versions::Bits";
  os << "(";
  bool first = true;
  if (value & ::test_versions::Bits::kA) {
    if (!first) os << "|";
    first = false;
    os << "kA";
  }
  if (value.has_unknown_bits()) {
    if (!first) os << "|";
    os << static_cast<uint32_t>(value.unknown_bits());
  }
  os << ")";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_versions::Struct>::Format(std::ostream& os, const ::test_versions::Struct& value) {
  os << "test_versions::Struct";
  os << "{ ";
  os << "x";
  os << " = " << fidl::ostream::Formatted<uint32_t>(value.x()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_versions::Table>::Format(std::ostream& os, const ::test_versions::Table& value) {
  os << "test_versions::Table";
  os << "{ ";
  if (value.x().has_value()) {
    os << "x";
    os << " = " << fidl::ostream::Formatted<uint32_t>(value.x().value()) << ", ";
  }
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_versions::Union>::Format(std::ostream& os, const ::test_versions::Union& value) {
  os << "test_versions::Union::";
  switch (value.Which()) {
    case ::test_versions::Union::Tag::kX:
      os << "x(" << fidl::ostream::Formatted<uint32_t>(value.x().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_versions {

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

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

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

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

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

#pragma clang diagnostic pop

}  // namespace test_versions
