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

#pragma once

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

//
// Domain objects declarations (i.e. "natural types" in unified bindings).
//
namespace fidl {
namespace test {
namespace inheritancewithrecursivedecl {

#ifdef __Fuchsia__
class Parent;
using ParentHandle = ::fidl::InterfaceHandle<Parent>;
#endif  // __Fuchsia__
#ifdef __Fuchsia__
class Child;
using ChildHandle = ::fidl::InterfaceHandle<Child>;
#endif  // __Fuchsia__
#ifdef __Fuchsia__

namespace _internal {
extern "C" const fidl_type_t
    fidl_test_inheritancewithrecursivedecl_ParentFirstRequestTable;
}

class Parent_RequestEncoder {
 public:
  static ::fidl::HLCPPOutgoingMessage First(
      ::fidl::Encoder* _encoder,
      ::fidl::InterfaceRequest<
          ::fidl::test::inheritancewithrecursivedecl::Parent>* request) {
    fidl_trace(WillHLCPPEncode);
    _encoder->Alloc(24 - sizeof(fidl_message_header_t));
    ::fidl::Encode(_encoder, request, 16);

    fidl_trace(
        DidHLCPPEncode,
        &_internal::
            fidl_test_inheritancewithrecursivedecl_ParentFirstRequestTable,
        _encoder->GetPtr<const char>(0), _encoder->CurrentLength(),
        _encoder->CurrentHandleCount());

    return _encoder->GetMessage();
  }
};

namespace _internal {}

class Parent_ResponseEncoder {
 public:
};

#endif  // __Fuchsia__
#ifdef __Fuchsia__

namespace _internal {
extern "C" const fidl_type_t
    fidl_test_inheritancewithrecursivedecl_ChildFirstRequestTable;
extern "C" const fidl_type_t
    fidl_test_inheritancewithrecursivedecl_ChildSecondRequestTable;
}  // namespace _internal

class Child_RequestEncoder {
 public:
  static ::fidl::HLCPPOutgoingMessage First(
      ::fidl::Encoder* _encoder,
      ::fidl::InterfaceRequest<
          ::fidl::test::inheritancewithrecursivedecl::Parent>* request) {
    fidl_trace(WillHLCPPEncode);
    _encoder->Alloc(24 - sizeof(fidl_message_header_t));
    ::fidl::Encode(_encoder, request, 16);

    fidl_trace(
        DidHLCPPEncode,
        &_internal::
            fidl_test_inheritancewithrecursivedecl_ChildFirstRequestTable,
        _encoder->GetPtr<const char>(0), _encoder->CurrentLength(),
        _encoder->CurrentHandleCount());

    return _encoder->GetMessage();
  }
  static ::fidl::HLCPPOutgoingMessage Second(
      ::fidl::Encoder* _encoder,
      ::fidl::InterfaceRequest<
          ::fidl::test::inheritancewithrecursivedecl::Parent>* request) {
    fidl_trace(WillHLCPPEncode);
    _encoder->Alloc(24 - sizeof(fidl_message_header_t));
    ::fidl::Encode(_encoder, request, 16);

    fidl_trace(
        DidHLCPPEncode,
        &_internal::
            fidl_test_inheritancewithrecursivedecl_ChildSecondRequestTable,
        _encoder->GetPtr<const char>(0), _encoder->CurrentLength(),
        _encoder->CurrentHandleCount());

    return _encoder->GetMessage();
  }
};

namespace _internal {}

class Child_ResponseEncoder {
 public:
};

#endif  // __Fuchsia__
}  // namespace inheritancewithrecursivedecl
}  // namespace test
}  // namespace fidl
namespace fidl {}  // namespace fidl

//
// Proxies and stubs declarations
//
namespace fidl {
namespace test {
namespace inheritancewithrecursivedecl {

#ifdef __Fuchsia__
using ParentPtr = ::fidl::InterfacePtr<Parent>;
class Parent_Proxy;
class Parent_Stub;
class Parent_EventSender;
class Parent_Sync;
using ParentSyncPtr = ::fidl::SynchronousInterfacePtr<Parent>;
class Parent_SyncProxy;

namespace internal {
constexpr uint64_t kParent_First_Ordinal = 0x2a592d0a81dac39blu;

}  // namespace internal
#endif  // __Fuchsia__
#ifdef __Fuchsia__
using ChildPtr = ::fidl::InterfacePtr<Child>;
class Child_Proxy;
class Child_Stub;
class Child_EventSender;
class Child_Sync;
using ChildSyncPtr = ::fidl::SynchronousInterfacePtr<Child>;
class Child_SyncProxy;

namespace internal {
constexpr uint64_t kChild_First_Ordinal = 0x2a592d0a81dac39blu;
constexpr uint64_t kChild_Second_Ordinal = 0x6cba5c5e01fee86lu;

}  // namespace internal
#endif  // __Fuchsia__
#ifdef __Fuchsia__
class Parent {
 public:
  using Proxy_ = Parent_Proxy;
  using Stub_ = Parent_Stub;
  using EventSender_ = Parent_EventSender;
  using Sync_ = Parent_Sync;
  virtual ~Parent();

  virtual void First(::fidl::InterfaceRequest<
                     ::fidl::test::inheritancewithrecursivedecl::Parent>
                         request) = 0;
};

class Parent_RequestDecoder {
 public:
  Parent_RequestDecoder() = default;
  virtual ~Parent_RequestDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal, bool* out_needs_response);
  virtual void First(::fidl::InterfaceRequest<
                     ::fidl::test::inheritancewithrecursivedecl::Parent>
                         request) = 0;
};

class Parent_ResponseDecoder {
 public:
  Parent_ResponseDecoder() = default;
  virtual ~Parent_ResponseDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal);
};

class Parent_EventSender {
 public:
  virtual ~Parent_EventSender();
};

class Parent_Sync {
 public:
  using Proxy_ = Parent_SyncProxy;
  virtual ~Parent_Sync();
  virtual zx_status_t First(::fidl::InterfaceRequest<
                            ::fidl::test::inheritancewithrecursivedecl::Parent>
                                request) = 0;
};

class Parent_Proxy final : public ::fidl::internal::Proxy, public Parent {
 public:
  explicit Parent_Proxy(::fidl::internal::ProxyController* controller);
  ~Parent_Proxy() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message) override;
  void First(::fidl::InterfaceRequest<
             ::fidl::test::inheritancewithrecursivedecl::Parent>
                 request) override;

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

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

class Parent_Stub final : public ::fidl::internal::Stub,
                          public Parent_EventSender {
 public:
  typedef class ::fidl::test::inheritancewithrecursivedecl::Parent Parent_clazz;
  explicit Parent_Stub(Parent_clazz* impl);
  ~Parent_Stub() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message,
                        ::fidl::internal::PendingResponse response) override;

 private:
  Parent_clazz* impl_;
};

class Parent_SyncProxy : public Parent_Sync {
 public:
  explicit Parent_SyncProxy(::zx::channel channel);
  ~Parent_SyncProxy() override;
  zx_status_t First(::fidl::InterfaceRequest<
                    ::fidl::test::inheritancewithrecursivedecl::Parent>
                        request) override;

 private:
  ::fidl::internal::SynchronousProxy proxy_;
  friend class ::fidl::SynchronousInterfacePtr<Parent>;
};

#endif  // __Fuchsia__
#ifdef __Fuchsia__
class Child {
 public:
  using Proxy_ = Child_Proxy;
  using Stub_ = Child_Stub;
  using EventSender_ = Child_EventSender;
  using Sync_ = Child_Sync;
  virtual ~Child();

  virtual void First(::fidl::InterfaceRequest<
                     ::fidl::test::inheritancewithrecursivedecl::Parent>
                         request) = 0;

  virtual void Second(::fidl::InterfaceRequest<
                      ::fidl::test::inheritancewithrecursivedecl::Parent>
                          request) = 0;
};

class Child_RequestDecoder {
 public:
  Child_RequestDecoder() = default;
  virtual ~Child_RequestDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal, bool* out_needs_response);
  virtual void First(::fidl::InterfaceRequest<
                     ::fidl::test::inheritancewithrecursivedecl::Parent>
                         request) = 0;
  virtual void Second(::fidl::InterfaceRequest<
                      ::fidl::test::inheritancewithrecursivedecl::Parent>
                          request) = 0;
};

class Child_ResponseDecoder {
 public:
  Child_ResponseDecoder() = default;
  virtual ~Child_ResponseDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal);
};

class Child_EventSender {
 public:
  virtual ~Child_EventSender();
};

class Child_Sync {
 public:
  using Proxy_ = Child_SyncProxy;
  virtual ~Child_Sync();
  virtual zx_status_t First(::fidl::InterfaceRequest<
                            ::fidl::test::inheritancewithrecursivedecl::Parent>
                                request) = 0;
  virtual zx_status_t Second(::fidl::InterfaceRequest<
                             ::fidl::test::inheritancewithrecursivedecl::Parent>
                                 request) = 0;
};

class Child_Proxy final : public ::fidl::internal::Proxy, public Child {
 public:
  explicit Child_Proxy(::fidl::internal::ProxyController* controller);
  ~Child_Proxy() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message) override;
  void First(::fidl::InterfaceRequest<
             ::fidl::test::inheritancewithrecursivedecl::Parent>
                 request) override;
  void Second(::fidl::InterfaceRequest<
              ::fidl::test::inheritancewithrecursivedecl::Parent>
                  request) override;

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

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

class Child_Stub final : public ::fidl::internal::Stub,
                         public Child_EventSender {
 public:
  typedef class ::fidl::test::inheritancewithrecursivedecl::Child Child_clazz;
  explicit Child_Stub(Child_clazz* impl);
  ~Child_Stub() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message,
                        ::fidl::internal::PendingResponse response) override;

 private:
  Child_clazz* impl_;
};

class Child_SyncProxy : public Child_Sync {
 public:
  explicit Child_SyncProxy(::zx::channel channel);
  ~Child_SyncProxy() override;
  zx_status_t First(::fidl::InterfaceRequest<
                    ::fidl::test::inheritancewithrecursivedecl::Parent>
                        request) override;
  zx_status_t Second(::fidl::InterfaceRequest<
                     ::fidl::test::inheritancewithrecursivedecl::Parent>
                         request) override;

 private:
  ::fidl::internal::SynchronousProxy proxy_;
  friend class ::fidl::SynchronousInterfacePtr<Child>;
};

#endif  // __Fuchsia__
}  // namespace inheritancewithrecursivedecl
}  // namespace test
}  // namespace fidl
