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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.typesinprotocols/cpp/wire.h>

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_typesinprotocols::Protocol> : public ::fidl::WireServer<::test_typesinprotocols::Protocol> {
 public:
  virtual ~WireTestBase<::test_typesinprotocols::Protocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OneWayBasic(
      ::test_typesinprotocols::wire::Basic* request,
      OneWayBasicCompleter::Sync& completer) override {
    NotImplemented_("OneWayBasic", completer);
  }
  virtual void TwoWayBasic(
      ::test_typesinprotocols::wire::Basic* request,
      TwoWayBasicCompleter::Sync& completer) override {
    NotImplemented_("TwoWayBasic", completer);
  }
  virtual void ErrorBasic(
      ErrorBasicCompleter::Sync& completer) override {
    NotImplemented_("ErrorBasic", completer);
  }
  virtual void OneWayCompound(
      ::test_typesinprotocols::wire::Compound* request,
      OneWayCompoundCompleter::Sync& completer) override {
    NotImplemented_("OneWayCompound", completer);
  }
  virtual void TwoWayCompound(
      ::test_typesinprotocols::wire::Compound* request,
      TwoWayCompoundCompleter::Sync& completer) override {
    NotImplemented_("TwoWayCompound", completer);
  }
  virtual void ErrorCompound(
      ErrorCompoundCompleter::Sync& completer) override {
    NotImplemented_("ErrorCompound", completer);
  }
  virtual void OneWayArrayBasic(
      ::test_typesinprotocols::wire::ArrayBasic* request,
      OneWayArrayBasicCompleter::Sync& completer) override {
    NotImplemented_("OneWayArrayBasic", completer);
  }
  virtual void TwoWayArrayBasic(
      ::test_typesinprotocols::wire::ArrayBasic* request,
      TwoWayArrayBasicCompleter::Sync& completer) override {
    NotImplemented_("TwoWayArrayBasic", completer);
  }
  virtual void ErrorArrayBasic(
      ErrorArrayBasicCompleter::Sync& completer) override {
    NotImplemented_("ErrorArrayBasic", completer);
  }
  virtual void OneWayArrayCompound(
      ::test_typesinprotocols::wire::ArrayCompound* request,
      OneWayArrayCompoundCompleter::Sync& completer) override {
    NotImplemented_("OneWayArrayCompound", completer);
  }
  virtual void TwoWayArrayCompound(
      ::test_typesinprotocols::wire::ArrayCompound* request,
      TwoWayArrayCompoundCompleter::Sync& completer) override {
    NotImplemented_("TwoWayArrayCompound", completer);
  }
  virtual void ErrorArrayCompound(
      ErrorArrayCompoundCompleter::Sync& completer) override {
    NotImplemented_("ErrorArrayCompound", completer);
  }
  virtual void OneWayVectorBasic(
      ::test_typesinprotocols::wire::VectorBasic* request,
      OneWayVectorBasicCompleter::Sync& completer) override {
    NotImplemented_("OneWayVectorBasic", completer);
  }
  virtual void TwoWayVectorBasic(
      ::test_typesinprotocols::wire::VectorBasic* request,
      TwoWayVectorBasicCompleter::Sync& completer) override {
    NotImplemented_("TwoWayVectorBasic", completer);
  }
  virtual void ErrorVectorBasic(
      ErrorVectorBasicCompleter::Sync& completer) override {
    NotImplemented_("ErrorVectorBasic", completer);
  }
  virtual void OneWayVectorCompound(
      ::test_typesinprotocols::wire::VectorCompound* request,
      OneWayVectorCompoundCompleter::Sync& completer) override {
    NotImplemented_("OneWayVectorCompound", completer);
  }
  virtual void TwoWayVectorCompound(
      ::test_typesinprotocols::wire::VectorCompound* request,
      TwoWayVectorCompoundCompleter::Sync& completer) override {
    NotImplemented_("TwoWayVectorCompound", completer);
  }
  virtual void ErrorVectorCompound(
      ErrorVectorCompoundCompleter::Sync& completer) override {
    NotImplemented_("ErrorVectorCompound", completer);
  }
  virtual void OneWayVectorOptional(
      ::test_typesinprotocols::wire::VectorOptional* request,
      OneWayVectorOptionalCompleter::Sync& completer) override {
    NotImplemented_("OneWayVectorOptional", completer);
  }
  virtual void TwoWayVectorOptional(
      ::test_typesinprotocols::wire::VectorOptional* request,
      TwoWayVectorOptionalCompleter::Sync& completer) override {
    NotImplemented_("TwoWayVectorOptional", completer);
  }
  virtual void ErrorVectorOptional(
      ErrorVectorOptionalCompleter::Sync& completer) override {
    NotImplemented_("ErrorVectorOptional", completer);
  }
  virtual void OneWayArrayVectorNested(
      ::test_typesinprotocols::wire::ArrayVectorNested* request,
      OneWayArrayVectorNestedCompleter::Sync& completer) override {
    NotImplemented_("OneWayArrayVectorNested", completer);
  }
  virtual void TwoWayArrayVectorNested(
      ::test_typesinprotocols::wire::ArrayVectorNested* request,
      TwoWayArrayVectorNestedCompleter::Sync& completer) override {
    NotImplemented_("TwoWayArrayVectorNested", completer);
  }
  virtual void ErrorArrayVectorNested(
      ErrorArrayVectorNestedCompleter::Sync& completer) override {
    NotImplemented_("ErrorArrayVectorNested", completer);
  }
  virtual void OneWayResource(
      ::test_typesinprotocols::wire::Resource* request,
      OneWayResourceCompleter::Sync& completer) override {
    NotImplemented_("OneWayResource", completer);
  }
  virtual void TwoWayResource(
      ::test_typesinprotocols::wire::Resource* request,
      TwoWayResourceCompleter::Sync& completer) override {
    NotImplemented_("TwoWayResource", completer);
  }
  virtual void ErrorResource(
      ErrorResourceCompleter::Sync& completer) override {
    NotImplemented_("ErrorResource", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_typesinprotocols::Protocol> : public ::fidl::WireSyncEventHandler<::test_typesinprotocols::Protocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_typesinprotocols::Protocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
  void EventBasic(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventBasic>* event) override {
    NotImplemented_("EventBasic");
  }
  void EventCompound(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventCompound>* event) override {
    NotImplemented_("EventCompound");
  }
  void EventArrayBasic(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventArrayBasic>* event) override {
    NotImplemented_("EventArrayBasic");
  }
  void EventArrayCompound(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventArrayCompound>* event) override {
    NotImplemented_("EventArrayCompound");
  }
  void EventVectorBasic(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventVectorBasic>* event) override {
    NotImplemented_("EventVectorBasic");
  }
  void EventVectorCompound(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventVectorCompound>* event) override {
    NotImplemented_("EventVectorCompound");
  }
  void EventVectorOptional(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventVectorOptional>* event) override {
    NotImplemented_("EventVectorOptional");
  }
  void EventArrayVectorNested(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventArrayVectorNested>* event) override {
    NotImplemented_("EventArrayVectorNested");
  }
  void EventResource(::fidl::WireEvent<::test_typesinprotocols::Protocol::EventResource>* event) override {
    NotImplemented_("EventResource");
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
