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

// fidl_experiment = output_index_json

#pragma once

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

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

namespace fidl {
namespace testing {

template <>
class WireTestBase<::test_anonymous::SomeProtocol> : public ::fidl::WireServer<::test_anonymous::SomeProtocol> {
 public:
  virtual ~WireTestBase<::test_anonymous::SomeProtocol>() = default;
  virtual void NotImplemented_(const std::string& name, ::fidl::CompleterBase& completer) = 0;
  virtual void SomeMethod(
      ::test_anonymous::wire::SomeProtocolSomeMethodRequest* request,
      SomeMethodCompleter::Sync& completer) override {
    NotImplemented_("SomeMethod", completer);
  }
};

template <>
class WireSyncEventHandlerTestBase<::test_anonymous::SomeProtocol> : public ::fidl::WireSyncEventHandler<::test_anonymous::SomeProtocol> {
 public:
  virtual ~WireSyncEventHandlerTestBase<::test_anonymous::SomeProtocol>() = default;
  virtual void NotImplemented_(const std::string& name) = 0;
};
#pragma clang diagnostic pop

}  // namespace testing
}  // namespace fidl
