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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class TestBase<::test_typesinprotocols::Protocol> : public ::fidl::Server<::test_typesinprotocols::Protocol> {
 public:
  virtual ~TestBase<::test_typesinprotocols::Protocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void OneWayBasic(OneWayBasicRequest& request,
                           OneWayBasicCompleter::Sync& completer) {
    NotImplemented_("OneWayBasic", completer);
  }
  virtual void TwoWayBasic(TwoWayBasicRequest& request,
                           TwoWayBasicCompleter::Sync& completer) {
    NotImplemented_("TwoWayBasic", completer);
  }
  virtual void ErrorBasic(
      ErrorBasicCompleter::Sync& completer) {
    NotImplemented_("ErrorBasic", completer);
  }
  virtual void OneWayCompound(OneWayCompoundRequest& request,
                              OneWayCompoundCompleter::Sync& completer) {
    NotImplemented_("OneWayCompound", completer);
  }
  virtual void TwoWayCompound(TwoWayCompoundRequest& request,
                              TwoWayCompoundCompleter::Sync& completer) {
    NotImplemented_("TwoWayCompound", completer);
  }
  virtual void ErrorCompound(
      ErrorCompoundCompleter::Sync& completer) {
    NotImplemented_("ErrorCompound", completer);
  }
  virtual void OneWayArrayBasic(OneWayArrayBasicRequest& request,
                                OneWayArrayBasicCompleter::Sync& completer) {
    NotImplemented_("OneWayArrayBasic", completer);
  }
  virtual void TwoWayArrayBasic(TwoWayArrayBasicRequest& request,
                                TwoWayArrayBasicCompleter::Sync& completer) {
    NotImplemented_("TwoWayArrayBasic", completer);
  }
  virtual void ErrorArrayBasic(
      ErrorArrayBasicCompleter::Sync& completer) {
    NotImplemented_("ErrorArrayBasic", completer);
  }
  virtual void OneWayArrayCompound(OneWayArrayCompoundRequest& request,
                                   OneWayArrayCompoundCompleter::Sync& completer) {
    NotImplemented_("OneWayArrayCompound", completer);
  }
  virtual void TwoWayArrayCompound(TwoWayArrayCompoundRequest& request,
                                   TwoWayArrayCompoundCompleter::Sync& completer) {
    NotImplemented_("TwoWayArrayCompound", completer);
  }
  virtual void ErrorArrayCompound(
      ErrorArrayCompoundCompleter::Sync& completer) {
    NotImplemented_("ErrorArrayCompound", completer);
  }
  virtual void OneWayVectorBasic(OneWayVectorBasicRequest& request,
                                 OneWayVectorBasicCompleter::Sync& completer) {
    NotImplemented_("OneWayVectorBasic", completer);
  }
  virtual void TwoWayVectorBasic(TwoWayVectorBasicRequest& request,
                                 TwoWayVectorBasicCompleter::Sync& completer) {
    NotImplemented_("TwoWayVectorBasic", completer);
  }
  virtual void ErrorVectorBasic(
      ErrorVectorBasicCompleter::Sync& completer) {
    NotImplemented_("ErrorVectorBasic", completer);
  }
  virtual void OneWayVectorCompound(OneWayVectorCompoundRequest& request,
                                    OneWayVectorCompoundCompleter::Sync& completer) {
    NotImplemented_("OneWayVectorCompound", completer);
  }
  virtual void TwoWayVectorCompound(TwoWayVectorCompoundRequest& request,
                                    TwoWayVectorCompoundCompleter::Sync& completer) {
    NotImplemented_("TwoWayVectorCompound", completer);
  }
  virtual void ErrorVectorCompound(
      ErrorVectorCompoundCompleter::Sync& completer) {
    NotImplemented_("ErrorVectorCompound", completer);
  }
  virtual void OneWayVectorOptional(OneWayVectorOptionalRequest& request,
                                    OneWayVectorOptionalCompleter::Sync& completer) {
    NotImplemented_("OneWayVectorOptional", completer);
  }
  virtual void TwoWayVectorOptional(TwoWayVectorOptionalRequest& request,
                                    TwoWayVectorOptionalCompleter::Sync& completer) {
    NotImplemented_("TwoWayVectorOptional", completer);
  }
  virtual void ErrorVectorOptional(
      ErrorVectorOptionalCompleter::Sync& completer) {
    NotImplemented_("ErrorVectorOptional", completer);
  }
  virtual void OneWayArrayVectorNested(OneWayArrayVectorNestedRequest& request,
                                       OneWayArrayVectorNestedCompleter::Sync& completer) {
    NotImplemented_("OneWayArrayVectorNested", completer);
  }
  virtual void TwoWayArrayVectorNested(TwoWayArrayVectorNestedRequest& request,
                                       TwoWayArrayVectorNestedCompleter::Sync& completer) {
    NotImplemented_("TwoWayArrayVectorNested", completer);
  }
  virtual void ErrorArrayVectorNested(
      ErrorArrayVectorNestedCompleter::Sync& completer) {
    NotImplemented_("ErrorArrayVectorNested", completer);
  }
  virtual void OneWayResource(OneWayResourceRequest& request,
                              OneWayResourceCompleter::Sync& completer) {
    NotImplemented_("OneWayResource", completer);
  }
  virtual void TwoWayResource(TwoWayResourceRequest& request,
                              TwoWayResourceCompleter::Sync& completer) {
    NotImplemented_("TwoWayResource", completer);
  }
  virtual void ErrorResource(
      ErrorResourceCompleter::Sync& completer) {
    NotImplemented_("ErrorResource", completer);
  }
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
