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

// fidl_experiment = output_index_json

#pragma once

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

class ComposedProtocol_TestBase : public ::test::protocollayoutssamelibrary::ComposedProtocol {
 public:
  virtual ~ComposedProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void OneWayAnonComposed(::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest) override {
    NotImplemented_("OneWayAnonComposed");
  }
  void TwoWayAnonComposed(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest, TwoWayAnonComposedCallback callback) override {
    NotImplemented_("TwoWayAnonComposed");
  }
  void TwoWayAnonComposedWithError(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest, TwoWayAnonComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonComposedWithError");
  }
  void OneWayNamedComposed(::test::protocollayoutssamelibrary::TablePayload TablePayload) override {
    NotImplemented_("OneWayNamedComposed");
  }
  void TwoWayNamedComposed(::test::protocollayoutssamelibrary::UnionPayload UnionPayload, TwoWayNamedComposedCallback callback) override {
    NotImplemented_("TwoWayNamedComposed");
  }
  void TwoWayNamedComposedWithError(::test::protocollayoutssamelibrary::TablePayload TablePayload, TwoWayNamedComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayNamedComposedWithError");
  }
};

class MainProtocol_TestBase : public ::test::protocollayoutssamelibrary::MainProtocol {
 public:
  virtual ~MainProtocol_TestBase() {}
  virtual void NotImplemented_(const std::string& name) = 0;
  void OneWayAnonComposed(::test::protocollayoutssamelibrary::ComposedProtocolOneWayAnonComposedRequest ComposedProtocolOneWayAnonComposedRequest) override {
    NotImplemented_("OneWayAnonComposed");
  }
  void TwoWayAnonComposed(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedRequest ComposedProtocolTwoWayAnonComposedRequest, TwoWayAnonComposedCallback callback) override {
    NotImplemented_("TwoWayAnonComposed");
  }
  void TwoWayAnonComposedWithError(::test::protocollayoutssamelibrary::ComposedProtocolTwoWayAnonComposedWithErrorRequest ComposedProtocolTwoWayAnonComposedWithErrorRequest, TwoWayAnonComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonComposedWithError");
  }
  void OneWayNamedComposed(::test::protocollayoutssamelibrary::TablePayload TablePayload) override {
    NotImplemented_("OneWayNamedComposed");
  }
  void TwoWayNamedComposed(::test::protocollayoutssamelibrary::UnionPayload UnionPayload, TwoWayNamedComposedCallback callback) override {
    NotImplemented_("TwoWayNamedComposed");
  }
  void TwoWayNamedComposedWithError(::test::protocollayoutssamelibrary::TablePayload TablePayload, TwoWayNamedComposedWithErrorCallback callback) override {
    NotImplemented_("TwoWayNamedComposedWithError");
  }
  void OneWayLocal(::test::protocollayoutssamelibrary::TablePayload TablePayload) override {
    NotImplemented_("OneWayLocal");
  }
  void TwoWayLocal(::test::protocollayoutssamelibrary::UnionPayload UnionPayload, TwoWayLocalCallback callback) override {
    NotImplemented_("TwoWayLocal");
  }
  void TwoWayLocalWithError(::test::protocollayoutssamelibrary::TablePayload TablePayload, TwoWayLocalWithErrorCallback callback) override {
    NotImplemented_("TwoWayLocalWithError");
  }
  void OneWayAnon(::test::protocollayoutssamelibrary::MainProtocolOneWayAnonRequest MainProtocolOneWayAnonRequest) override {
    NotImplemented_("OneWayAnon");
  }
  void TwoWayAnon(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonRequest MainProtocolTwoWayAnonRequest, TwoWayAnonCallback callback) override {
    NotImplemented_("TwoWayAnon");
  }
  void TwoWayAnonWithError(::test::protocollayoutssamelibrary::MainProtocolTwoWayAnonWithErrorRequest MainProtocolTwoWayAnonWithErrorRequest, TwoWayAnonWithErrorCallback callback) override {
    NotImplemented_("TwoWayAnonWithError");
  }
};
}  // namespace testing
}  // namespace protocollayoutssamelibrary
}  // namespace test
