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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.driverservice/cpp/natural_types.h>
#include <lib/fidl/cpp/natural_ostream.h>
#include <lib/fidl_driver/cpp/natural_ostream.h>

#include <iostream>

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

namespace test_driverservice {

}  // namespace test_driverservice

#ifdef __Fuchsia__

template <>
struct fidl::ostream::Formatter<::fdf::ClientEnd<::test_driverservice::SomeDriverProtocol>> {
  static std::ostream& Format(std::ostream& os, const ::fdf::ClientEnd<::test_driverservice::SomeDriverProtocol>& value) {
    return os << "ClientEnd<" << "test_driverservice::SomeDriverProtocol" << ">(" << value.channel().get() << ")";
  }
};

template <>
struct fidl::ostream::Formatter<::fdf::ServerEnd<::test_driverservice::SomeDriverProtocol>> {
  static std::ostream& Format(std::ostream& os, const ::fdf::ServerEnd<::test_driverservice::SomeDriverProtocol>& value) {
    return os << "ServerEnd<" << "test_driverservice::SomeDriverProtocol" << ">(" << value.channel().get() << ")";
  }
};

namespace fdf {

inline std::ostream& operator<<(std::ostream& os, const ::fdf::ClientEnd<::test_driverservice::SomeDriverProtocol>& value) {
  return fidl::ostream::Formatter<::fdf::ClientEnd<::test_driverservice::SomeDriverProtocol>>::Format(os, value);
}

inline std::ostream& operator<<(std::ostream& os, const ::fdf::ServerEnd<::test_driverservice::SomeDriverProtocol>& value) {
  return fidl::ostream::Formatter<::fdf::ServerEnd<::test_driverservice::SomeDriverProtocol>>::Format(os, value);
}
}  // namespace fdf

#endif  // __Fuchsia__

#pragma clang diagnostic pop
