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

// fidl_experiment = output_index_json

#pragma once

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

#include <iostream>

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

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

namespace test_inheritancewithrecursivedecl {

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_inheritancewithrecursivedecl::ParentFirstRequest& value);

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& operator<<(std::ostream& os, const ::test_inheritancewithrecursivedecl::ChildSecondRequest& value);

#endif  // __Fuchsia__

}  // namespace test_inheritancewithrecursivedecl

#ifdef __Fuchsia__

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

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

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

namespace fidl {

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

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

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

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop
