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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/fdf/cpp/natural_ostream.h>
#include <fidl/test.handles/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"

#ifdef __Fuchsia__

template <>
struct fidl::ostream::Formatter<::test_handles::Handles> {
  static std::ostream& Format(std::ostream& os, const ::test_handles::Handles& value);
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct fidl::ostream::Formatter<::test_handles::FdfHandles> {
  static std::ostream& Format(std::ostream& os, const ::test_handles::FdfHandles& value);
};

#endif  // __Fuchsia__

namespace test_handles {

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_handles::Handles& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_handles::FdfHandles& value);

#endif  // __Fuchsia__

}  // namespace test_handles

#ifdef __Fuchsia__

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

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

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

namespace fidl {

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

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

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
