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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.driverhandle/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_driverhandle::ClientEndWrapper> {
  static std::ostream& Format(std::ostream& os, const ::test_driverhandle::ClientEndWrapper& value);
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

namespace test_driverhandle {

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_driverhandle::ClientEndWrapper& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_driverhandle::ServerEndWrapper& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_driverhandle::T& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_driverhandle::HandlesInProtocolSendHandlesRequest& value);

#endif  // __Fuchsia__

}  // namespace test_driverhandle

#ifdef __Fuchsia__

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

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

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

namespace fdf {

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

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

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
