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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_vectors::ExampleUseOfVectors>::Format(std::ostream& os, const ::test_vectors::ExampleUseOfVectors& value) {
  os << "test_vectors::ExampleUseOfVectors";
  os << "{ ";
  os << "vector_of_uint8";
  os << " = " << fidl::ostream::Formatted<::std::vector<uint8_t>>(value.vector_of_uint8()) << ", ";
  os << "vector_of_vector_of_bool";
  os << " = " << fidl::ostream::Formatted<::std::vector<::std::vector<bool>>>(value.vector_of_vector_of_bool()) << ", ";
  os << "}";
  return os;
}

namespace test_vectors {

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

#pragma clang diagnostic pop

}  // namespace test_vectors
