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

#pragma once

#include <fidl/test/protocols/cpp/fidl.h>
namespace fidl {
namespace test {
namespace protocols {
namespace testing {

class Transitional_TestBase : public Transitional {
 public:
  virtual ~Transitional_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void Request(int64_t x, RequestCallback callback) override {
    NotImplemented_("Request");
  }
  void OneWay(int64_t x) override { NotImplemented_("OneWay"); }
};

class ChannelProtocol_TestBase : public ChannelProtocol {
 public:
  virtual ~ChannelProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void MethodA(int64_t a, int64_t b) override { NotImplemented_("MethodA"); }
  void MethodB(int64_t a, int64_t b, MethodBCallback callback) override {
    NotImplemented_("MethodB");
  }
  void TakeHandle(::zx::handle h, TakeHandleCallback callback) override {
    NotImplemented_("TakeHandle");
  }
  void MutateSocket(::zx::socket a, MutateSocketCallback callback) override {
    NotImplemented_("MutateSocket");
  }
};

class WithAndWithoutRequestResponse_TestBase
    : public WithAndWithoutRequestResponse {
 public:
  virtual ~WithAndWithoutRequestResponse_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void NoRequestNoResponse() override {
    NotImplemented_("NoRequestNoResponse");
  }
  void NoRequestEmptyResponse(
      NoRequestEmptyResponseCallback callback) override {
    NotImplemented_("NoRequestEmptyResponse");
  }
  void NoRequestWithResponse(NoRequestWithResponseCallback callback) override {
    NotImplemented_("NoRequestWithResponse");
  }
  void WithRequestNoResponse(::std::string arg) override {
    NotImplemented_("WithRequestNoResponse");
  }
  void WithRequestEmptyResponse(
      ::std::string arg, WithRequestEmptyResponseCallback callback) override {
    NotImplemented_("WithRequestEmptyResponse");
  }
  void WithRequestWithResponse(
      ::std::string arg, WithRequestWithResponseCallback callback) override {
    NotImplemented_("WithRequestWithResponse");
  }
};

class WithErrorSyntax_TestBase : public WithErrorSyntax {
 public:
  virtual ~WithErrorSyntax_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void ResponseAsStruct(ResponseAsStructCallback callback) override {
    NotImplemented_("ResponseAsStruct");
  }
  void ErrorAsPrimitive(ErrorAsPrimitiveCallback callback) override {
    NotImplemented_("ErrorAsPrimitive");
  }
  void ErrorAsEnum(ErrorAsEnumCallback callback) override {
    NotImplemented_("ErrorAsEnum");
  }
};
}  // namespace testing
}  // namespace protocols
}  // namespace test
}  // namespace fidl
