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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_union::Pizza>::Format(std::ostream& os, const ::test_union::Pizza& value) {
  os << "test_union::Pizza";
  os << "{ ";
  os << "toppings";
  os << " = " << fidl::ostream::Formatted<::std::vector<::std::string>>(value.toppings()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::Pasta>::Format(std::ostream& os, const ::test_union::Pasta& value) {
  os << "test_union::Pasta";
  os << "{ ";
  os << "sauce";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.sauce()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::NullableUnionStruct>::Format(std::ostream& os, const ::test_union::NullableUnionStruct& value) {
  os << "test_union::NullableUnionStruct";
  os << "{ ";
  os << "the_union";
  os << " = " << fidl::ostream::Formatted<::fidl::Box<::test_union::Union>>(value.the_union()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::Empty>::Format(std::ostream& os, const ::test_union::Empty& value) {
  os << "test_union::Empty";
  os << "{ ";
  os << "__reserved";
  os << " = " << fidl::ostream::Formatted<uint8_t>(value.__reserved()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse>::Format(std::ostream& os, const ::test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse& value) {
  os << "test_union::TestProtocolStrictUnionHenceResponseMayBeStackAllocatedResponse";
  os << "{ ";
  os << "xu";
  os << " = " << fidl::ostream::Formatted<::test_union::StrictBoundedUnion>(value.xu()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse>::Format(std::ostream& os, const ::test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse& value) {
  os << "test_union::TestProtocolFlexibleUnionHenceResponseMustBeHeapAllocatedResponse";
  os << "{ ";
  os << "xu";
  os << " = " << fidl::ostream::Formatted<::test_union::OlderSimpleUnion>(value.xu()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StructWithNullableUnion>::Format(std::ostream& os, const ::test_union::StructWithNullableUnion& value) {
  os << "test_union::StructWithNullableUnion";
  os << "{ ";
  os << "x1";
  os << " = " << fidl::ostream::Formatted<::fidl::Box<::test_union::OlderSimpleUnion>>(value.x1()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::UnionSandwich>::Format(std::ostream& os, const ::test_union::UnionSandwich& value) {
  os << "test_union::UnionSandwich";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<uint32_t>(value.a()) << ", ";
  os << "u";
  os << " = " << fidl::ostream::Formatted<::test_union::ExplicitFlexibleUnion>(value.u()) << ", ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<uint32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::PizzaOrPasta>::Format(std::ostream& os, const ::test_union::PizzaOrPasta& value) {
  os << "test_union::PizzaOrPasta::";
  switch (value.Which()) {
    case ::test_union::PizzaOrPasta::Tag::kPizza:
      os << "pizza(" << fidl::ostream::Formatted<::test_union::Pizza>(value.pizza().value()) << ")";
      break;
    case ::test_union::PizzaOrPasta::Tag::kPasta:
      os << "pasta(" << fidl::ostream::Formatted<::test_union::Pasta>(value.pasta().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ExplicitPizzaOrPasta>::Format(std::ostream& os, const ::test_union::ExplicitPizzaOrPasta& value) {
  os << "test_union::ExplicitPizzaOrPasta::";
  switch (value.Which()) {
    case ::test_union::ExplicitPizzaOrPasta::Tag::kPizza:
      os << "pizza(" << fidl::ostream::Formatted<::test_union::Pizza>(value.pizza().value()) << ")";
      break;
    case ::test_union::ExplicitPizzaOrPasta::Tag::kPasta:
      os << "pasta(" << fidl::ostream::Formatted<::test_union::Pasta>(value.pasta().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::FlexiblePizzaOrPasta>::Format(std::ostream& os, const ::test_union::FlexiblePizzaOrPasta& value) {
  os << "test_union::FlexiblePizzaOrPasta::";
  switch (value.Which()) {
    case ::test_union::FlexiblePizzaOrPasta::Tag::kPizza:
      os << "pizza(" << fidl::ostream::Formatted<::test_union::Pizza>(value.pizza().value()) << ")";
      break;
    case ::test_union::FlexiblePizzaOrPasta::Tag::kPasta:
      os << "pasta(" << fidl::ostream::Formatted<::test_union::Pasta>(value.pasta().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StrictPizzaOrPasta>::Format(std::ostream& os, const ::test_union::StrictPizzaOrPasta& value) {
  os << "test_union::StrictPizzaOrPasta::";
  switch (value.Which()) {
    case ::test_union::StrictPizzaOrPasta::Tag::kPizza:
      os << "pizza(" << fidl::ostream::Formatted<::test_union::Pizza>(value.pizza().value()) << ")";
      break;
    case ::test_union::StrictPizzaOrPasta::Tag::kPasta:
      os << "pasta(" << fidl::ostream::Formatted<::test_union::Pasta>(value.pasta().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::Union>::Format(std::ostream& os, const ::test_union::Union& value) {
  os << "test_union::Union::";
  switch (value.Which()) {
    case ::test_union::Union::Tag::kPrimitive:
      os << "primitive(" << fidl::ostream::Formatted<int32_t>(value.primitive().value()) << ")";
      break;
    case ::test_union::Union::Tag::kStringNeedsConstructor:
      os << "string_needs_constructor(" << fidl::ostream::Formatted<::std::string>(value.string_needs_constructor().value()) << ")";
      break;
    case ::test_union::Union::Tag::kVectorStringAlsoNeedsConstructor:
      os << "vector_string_also_needs_constructor(" << fidl::ostream::Formatted<::std::vector<::std::string>>(value.vector_string_also_needs_constructor().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::FlexibleUnion>::Format(std::ostream& os, const ::test_union::FlexibleUnion& value) {
  os << "test_union::FlexibleUnion::";
  switch (value.Which()) {
    case ::test_union::FlexibleUnion::Tag::kPrimitive:
      os << "primitive(" << fidl::ostream::Formatted<int32_t>(value.primitive().value()) << ")";
      break;
    case ::test_union::FlexibleUnion::Tag::kStringNeedsConstructor:
      os << "string_needs_constructor(" << fidl::ostream::Formatted<::std::string>(value.string_needs_constructor().value()) << ")";
      break;
    case ::test_union::FlexibleUnion::Tag::kVectorStringAlsoNeedsConstructor:
      os << "vector_string_also_needs_constructor(" << fidl::ostream::Formatted<::std::vector<::std::string>>(value.vector_string_also_needs_constructor().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StrictUnion>::Format(std::ostream& os, const ::test_union::StrictUnion& value) {
  os << "test_union::StrictUnion::";
  switch (value.Which()) {
    case ::test_union::StrictUnion::Tag::kPrimitive:
      os << "primitive(" << fidl::ostream::Formatted<int32_t>(value.primitive().value()) << ")";
      break;
    case ::test_union::StrictUnion::Tag::kStringNeedsConstructor:
      os << "string_needs_constructor(" << fidl::ostream::Formatted<::std::string>(value.string_needs_constructor().value()) << ")";
      break;
    case ::test_union::StrictUnion::Tag::kVectorStringAlsoNeedsConstructor:
      os << "vector_string_also_needs_constructor(" << fidl::ostream::Formatted<::std::vector<::std::string>>(value.vector_string_also_needs_constructor().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::FieldCollision>::Format(std::ostream& os, const ::test_union::FieldCollision& value) {
  os << "test_union::FieldCollision::";
  switch (value.Which()) {
    case ::test_union::FieldCollision::Tag::kFieldCollisionTag:
      os << "field_collision_tag(" << fidl::ostream::Formatted<int32_t>(value.field_collision_tag().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ExplicitUnion>::Format(std::ostream& os, const ::test_union::ExplicitUnion& value) {
  os << "test_union::ExplicitUnion::";
  switch (value.Which()) {
    case ::test_union::ExplicitUnion::Tag::kPrimitive:
      os << "primitive(" << fidl::ostream::Formatted<int32_t>(value.primitive().value()) << ")";
      break;
    case ::test_union::ExplicitUnion::Tag::kStringNeedsConstructor:
      os << "string_needs_constructor(" << fidl::ostream::Formatted<::std::string>(value.string_needs_constructor().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ReverseOrdinalUnion>::Format(std::ostream& os, const ::test_union::ReverseOrdinalUnion& value) {
  os << "test_union::ReverseOrdinalUnion::";
  switch (value.Which()) {
    case ::test_union::ReverseOrdinalUnion::Tag::kFirst:
      os << "first(" << fidl::ostream::Formatted<uint32_t>(value.first().value()) << ")";
      break;
    case ::test_union::ReverseOrdinalUnion::Tag::kSecond:
      os << "second(" << fidl::ostream::Formatted<uint32_t>(value.second().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::FlexibleFoo>::Format(std::ostream& os, const ::test_union::FlexibleFoo& value) {
  os << "test_union::FlexibleFoo::";
  switch (value.Which()) {
    case ::test_union::FlexibleFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    case ::test_union::FlexibleFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StrictFoo>::Format(std::ostream& os, const ::test_union::StrictFoo& value) {
  os << "test_union::StrictFoo::";
  switch (value.Which()) {
    case ::test_union::StrictFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    case ::test_union::StrictFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ExplicitFoo>::Format(std::ostream& os, const ::test_union::ExplicitFoo& value) {
  os << "test_union::ExplicitFoo::";
  switch (value.Which()) {
    case ::test_union::ExplicitFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    case ::test_union::ExplicitFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ExplicitStrictFoo>::Format(std::ostream& os, const ::test_union::ExplicitStrictFoo& value) {
  os << "test_union::ExplicitStrictFoo::";
  switch (value.Which()) {
    case ::test_union::ExplicitStrictFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    case ::test_union::ExplicitStrictFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::OlderSimpleUnion>::Format(std::ostream& os, const ::test_union::OlderSimpleUnion& value) {
  os << "test_union::OlderSimpleUnion::";
  switch (value.Which()) {
    case ::test_union::OlderSimpleUnion::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int64_t>(value.i().value()) << ")";
      break;
    case ::test_union::OlderSimpleUnion::Tag::kF:
      os << "f(" << fidl::ostream::Formatted<float>(value.f().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::NewerSimpleUnion>::Format(std::ostream& os, const ::test_union::NewerSimpleUnion& value) {
  os << "test_union::NewerSimpleUnion::";
  switch (value.Which()) {
    case ::test_union::NewerSimpleUnion::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int64_t>(value.i().value()) << ")";
      break;
    case ::test_union::NewerSimpleUnion::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    case ::test_union::NewerSimpleUnion::Tag::kV:
      os << "v(" << fidl::ostream::Formatted<::std::vector<::std::string>>(value.v().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StrictSimpleUnion>::Format(std::ostream& os, const ::test_union::StrictSimpleUnion& value) {
  os << "test_union::StrictSimpleUnion::";
  switch (value.Which()) {
    case ::test_union::StrictSimpleUnion::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    case ::test_union::StrictSimpleUnion::Tag::kF:
      os << "f(" << fidl::ostream::Formatted<float>(value.f().value()) << ")";
      break;
    case ::test_union::StrictSimpleUnion::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::UnionContainingEmptyStruct>::Format(std::ostream& os, const ::test_union::UnionContainingEmptyStruct& value) {
  os << "test_union::UnionContainingEmptyStruct::";
  switch (value.Which()) {
    case ::test_union::UnionContainingEmptyStruct::Tag::kEmpty:
      os << "empty(" << fidl::ostream::Formatted<::test_union::Empty>(value.empty().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::StrictBoundedUnion>::Format(std::ostream& os, const ::test_union::StrictBoundedUnion& value) {
  os << "test_union::StrictBoundedUnion::";
  switch (value.Which()) {
    case ::test_union::StrictBoundedUnion::Tag::kV:
      os << "v(" << fidl::ostream::Formatted<::std::vector<uint8_t>>(value.v().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::ExplicitFlexibleUnion>::Format(std::ostream& os, const ::test_union::ExplicitFlexibleUnion& value) {
  os << "test_union::ExplicitFlexibleUnion::";
  switch (value.Which()) {
    case ::test_union::ExplicitFlexibleUnion::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int64_t>(value.i().value()) << ")";
      break;
    case ::test_union::ExplicitFlexibleUnion::Tag::kF:
      os << "f(" << fidl::ostream::Formatted<float>(value.f().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::UnionWithAttributes>::Format(std::ostream& os, const ::test_union::UnionWithAttributes& value) {
  os << "test_union::UnionWithAttributes::";
  switch (value.Which()) {
    case ::test_union::UnionWithAttributes::Tag::kX:
      os << "x(" << fidl::ostream::Formatted<int64_t>(value.x().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_union::EmptyFlexibleUnion>::Format(std::ostream& os, const ::test_union::EmptyFlexibleUnion& value) {
  os << "test_union::EmptyFlexibleUnion::";
  switch (value.Which()) {
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_union {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#pragma clang diagnostic pop

}  // namespace test_union
