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

#pragma once

#include "lib/fidl/cpp/internal/header.h"


namespace test {
namespace name {

class SwitchingOrdinals;
using SwitchingOrdinalsPtr = ::fidl::InterfacePtr<SwitchingOrdinals>;
class SwitchingOrdinals_Proxy;
class SwitchingOrdinals_Stub;
class SwitchingOrdinals_EventSender;
class SwitchingOrdinals_Sync;
using SwitchingOrdinalsSyncPtr = ::fidl::SynchronousInterfacePtr<SwitchingOrdinals>;
class SwitchingOrdinals_SyncProxy;

class SwitchingOrdinals {
 public:
  using Proxy_ = SwitchingOrdinals_Proxy;
  using Stub_ = SwitchingOrdinals_Stub;
  using EventSender_ = SwitchingOrdinals_EventSender;
  using Sync_ = SwitchingOrdinals_Sync;
  virtual ~SwitchingOrdinals();
      
  virtual void OrdinalFive() = 0;
      
  virtual void OnlyGeneratedOrdinal() = 0;
  using EventOrdinalFifteenCallback =
      fit::function<void()>;
  using EventOnlyGeneratedOrdinalCallback =
      fit::function<void()>;
};

class SwitchingOrdinals_EventSender {
 public:
  virtual ~SwitchingOrdinals_EventSender();
  virtual void EventOrdinalFifteen() = 0;
  virtual void EventOnlyGeneratedOrdinal() = 0;
};

class SwitchingOrdinals_Sync {
 public:
  using Proxy_ = SwitchingOrdinals_SyncProxy;
  virtual ~SwitchingOrdinals_Sync();
  virtual zx_status_t OrdinalFive() = 0;
  virtual zx_status_t OnlyGeneratedOrdinal() = 0;
};

class SwitchingOrdinals_Proxy : public ::fidl::internal::Proxy, public SwitchingOrdinals {
 public:
  explicit SwitchingOrdinals_Proxy(::fidl::internal::ProxyController* controller);
  ~SwitchingOrdinals_Proxy() override;

  zx_status_t Dispatch_(::fidl::Message message) override;
  void OrdinalFive() override;
  void OnlyGeneratedOrdinal() override;
  EventOrdinalFifteenCallback EventOrdinalFifteen;
  EventOnlyGeneratedOrdinalCallback EventOnlyGeneratedOrdinal;

 private:
  SwitchingOrdinals_Proxy(const SwitchingOrdinals_Proxy&) = delete;
  SwitchingOrdinals_Proxy& operator=(const SwitchingOrdinals_Proxy&) = delete;

  ::fidl::internal::ProxyController* controller_;
};

class SwitchingOrdinals_Stub : public ::fidl::internal::Stub, public SwitchingOrdinals_EventSender {
 public:
  typedef class SwitchingOrdinals SwitchingOrdinals_clazz;
  explicit SwitchingOrdinals_Stub(SwitchingOrdinals_clazz* impl);
  ~SwitchingOrdinals_Stub() override;

  zx_status_t Dispatch_(::fidl::Message message,
                        ::fidl::internal::PendingResponse response) override;
  void EventOrdinalFifteen() override;
  void EventOnlyGeneratedOrdinal() override;

 private:
  SwitchingOrdinals_clazz* impl_;
};

class SwitchingOrdinals_SyncProxy : public SwitchingOrdinals_Sync {
 public:
  explicit SwitchingOrdinals_SyncProxy(::zx::channel channel);
  ~SwitchingOrdinals_SyncProxy() override;

  ::fidl::internal::SynchronousProxy& proxy() { return proxy_; }
  zx_status_t OrdinalFive() override;
  zx_status_t OnlyGeneratedOrdinal() override;

  private:
  ::fidl::internal::SynchronousProxy proxy_;
};
}  // namespace name
}  // namespace test
namespace fidl {
}  // namespace fidl
