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

// fidl_experiment = output_index_json

#pragma once

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

#include <iostream>

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

template <>
struct fidl::ostream::Formatter<::test_versions::Bits> {
  static std::ostream& Format(std::ostream& os, const ::test_versions::Bits& value);
};
template <>
struct fidl::ostream::Formatter<::test_versions::Enum> {
  static std::ostream& Format(std::ostream& os, const ::test_versions::Enum& value);
};
template <>
struct fidl::ostream::Formatter<::test_versions::Struct> {
  static std::ostream& Format(std::ostream& os, const ::test_versions::Struct& value);
};
template <>
struct fidl::ostream::Formatter<::test_versions::Table> {
  static std::ostream& Format(std::ostream& os, const ::test_versions::Table& value);
};
template <>
struct fidl::ostream::Formatter<::test_versions::Union> {
  static std::ostream& Format(std::ostream& os, const ::test_versions::Union& value);
};

namespace test_versions {

std::ostream& operator<<(std::ostream& os, const ::test_versions::Bits& value);

std::ostream& operator<<(std::ostream& os, const ::test_versions::Enum& value);

std::ostream& operator<<(std::ostream& os, const ::test_versions::Struct& value);

std::ostream& operator<<(std::ostream& os, const ::test_versions::Table& value);

std::ostream& operator<<(std::ostream& os, const ::test_versions::Union& value);

}  // namespace test_versions

#ifdef __Fuchsia__

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

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

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

namespace fidl {

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

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

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
