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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.doccomments/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_doccomments::MyStrictBits> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::MyStrictBits& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::MyFlexibleBits> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::MyFlexibleBits& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::MyStrictEnum> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::MyStrictEnum& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::MyFlexibleEnum> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::MyFlexibleEnum& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::Struct> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::Struct& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::StrictUnion> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::StrictUnion& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::FlexibleUnion> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::FlexibleUnion& value);
};
template <>
struct fidl::ostream::Formatter<::test_doccomments::Table> {
  static std::ostream& Format(std::ostream& os, const ::test_doccomments::Table& value);
};

namespace test_doccomments {

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::MyStrictBits& value);

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::MyFlexibleBits& value);

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::MyStrictEnum& value);

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::MyFlexibleEnum& value);

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

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::StrictUnion& value);

std::ostream& operator<<(std::ostream& os, const ::test_doccomments::FlexibleUnion& value);

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

}  // namespace test_doccomments

#ifdef __Fuchsia__

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

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

namespace fidl {

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
