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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.typesinprotocols/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_typesinprotocols::Bits> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Bits& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Enum> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Enum& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Struct> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Struct& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Table> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Table& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Union> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Union& value);
};
#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Basic> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Basic& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::Compound> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::Compound& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ArrayBasic> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ArrayBasic& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ArrayCompound> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ArrayCompound& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::VectorBasic> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::VectorBasic& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::VectorCompound> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::VectorCompound& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::VectorOptional> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::VectorOptional& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ArrayVectorNested> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ArrayVectorNested& value);
};
#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorBasicResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorBasicResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorCompoundResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorCompoundResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorArrayBasicResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayBasicResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorArrayCompoundResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayCompoundResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorVectorBasicResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorBasicResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorVectorCompoundResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorCompoundResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorVectorOptionalResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorOptionalResult& value);
};
template <>
struct fidl::ostream::Formatter<::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult> {
  static std::ostream& Format(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult& value);
};
#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

namespace test_typesinprotocols {

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

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

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

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

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

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ResourceStruct& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ResourceTable& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ResourceUnion& value);

#endif  // __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::Basic& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::Compound& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ArrayBasic& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ArrayCompound& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::VectorBasic& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::VectorCompound& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::VectorOptional& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ArrayVectorNested& value);

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::Resource& value);

#endif  // __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorBasicResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorCompoundResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayBasicResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayCompoundResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorBasicResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorCompoundResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorVectorOptionalResult& value);

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorArrayVectorNestedResult& value);

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_typesinprotocols::ProtocolErrorResourceResult& value);

#endif  // __Fuchsia__

}  // namespace test_typesinprotocols

#ifdef __Fuchsia__

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

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

namespace fidl {

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
