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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.emptystruct/cpp/common_types.h>
#include <fidl/test.emptystruct/cpp/markers.h>
#include <lib/fidl/cpp/natural_coding_traits.h>
#include <lib/fidl/cpp/natural_types.h>

#include <cinttypes>
#include <string>

#ifdef __Fuchsia__

#include <lib/zx/channel.h>

#endif  // __Fuchsia__

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

namespace test_emptystruct {

class Empty;

class EmptyProtocolSendRequest;

class EmptyProtocolReceiveRequest;

class EmptyProtocolSendAndReceiveRequest;

class EmptyProtocolSendAndReceiveResponse;

class Empty {
 private:
  struct Storage_;

 public:
  Empty(Storage_ storage) noexcept;
  Empty(uint8_t __reserved) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |Empty| only if all of its members are default constructible.
  Empty() = default;
#pragma clang diagnostic pop

  Empty(Empty&&) noexcept = default;
  Empty& operator=(Empty&&) noexcept = default;
  Empty(const Empty& other) noexcept;
  Empty& operator=(const Empty& other) noexcept;

  bool operator==(const Empty& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::Empty, 1>::Equal(this, &other);
  }
  bool operator!=(const Empty& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::Empty, 1>::Equal(this, &other);
  }

  uint8_t
  __reserved() const {
    return storage_.__reserved;
  }

  uint8_t& __reserved() {
    return storage_.__reserved;
  }

  // Setter for __reserved.
  //

  Empty& __reserved(uint8_t value);

  Empty(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint8_t __reserved = 0u;
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::Empty, 1>;
  friend struct ::fidl::internal::MemberVisitor<::test_emptystruct::Empty>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint8_t, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::__reserved, 0});
  static constexpr auto kPadding = std::make_tuple();
};

class EmptyProtocolSendRequest {
 private:
  struct Storage_;

 public:
  EmptyProtocolSendRequest(Storage_ storage) noexcept;
  EmptyProtocolSendRequest(::test_emptystruct::Empty e) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |EmptyProtocolSendRequest| only if all of its members are default constructible.
  EmptyProtocolSendRequest() = default;
#pragma clang diagnostic pop

  EmptyProtocolSendRequest(EmptyProtocolSendRequest&&) noexcept = default;
  EmptyProtocolSendRequest& operator=(EmptyProtocolSendRequest&&) noexcept = default;
  EmptyProtocolSendRequest(const EmptyProtocolSendRequest& other) noexcept;
  EmptyProtocolSendRequest& operator=(const EmptyProtocolSendRequest& other) noexcept;

  bool operator==(const EmptyProtocolSendRequest& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendRequest, 1>::Equal(this, &other);
  }
  bool operator!=(const EmptyProtocolSendRequest& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendRequest, 1>::Equal(this, &other);
  }

  const ::test_emptystruct::Empty&
  e() const {
    return storage_.e;
  }

  ::test_emptystruct::Empty& e() {
    return storage_.e;
  }

  // Setter for e.
  //

  EmptyProtocolSendRequest& e(::test_emptystruct::Empty value);

  EmptyProtocolSendRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::test_emptystruct::Empty e;
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendRequest, 1>;
  friend struct ::fidl::internal::MemberVisitor<::test_emptystruct::EmptyProtocolSendRequest>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::test_emptystruct::Empty, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::e, 0});
  static constexpr auto kPadding = std::make_tuple();
};

class EmptyProtocolReceiveRequest {
 private:
  struct Storage_;

 public:
  EmptyProtocolReceiveRequest(Storage_ storage) noexcept;
  EmptyProtocolReceiveRequest(::test_emptystruct::Empty e) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |EmptyProtocolReceiveRequest| only if all of its members are default constructible.
  EmptyProtocolReceiveRequest() = default;
#pragma clang diagnostic pop

  EmptyProtocolReceiveRequest(EmptyProtocolReceiveRequest&&) noexcept = default;
  EmptyProtocolReceiveRequest& operator=(EmptyProtocolReceiveRequest&&) noexcept = default;
  EmptyProtocolReceiveRequest(const EmptyProtocolReceiveRequest& other) noexcept;
  EmptyProtocolReceiveRequest& operator=(const EmptyProtocolReceiveRequest& other) noexcept;

  bool operator==(const EmptyProtocolReceiveRequest& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolReceiveRequest, 1>::Equal(this, &other);
  }
  bool operator!=(const EmptyProtocolReceiveRequest& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolReceiveRequest, 1>::Equal(this, &other);
  }

  const ::test_emptystruct::Empty&
  e() const {
    return storage_.e;
  }

  ::test_emptystruct::Empty& e() {
    return storage_.e;
  }

  // Setter for e.
  //

  EmptyProtocolReceiveRequest& e(::test_emptystruct::Empty value);

  EmptyProtocolReceiveRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::test_emptystruct::Empty e;
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolReceiveRequest, 1>;
  friend struct ::fidl::internal::MemberVisitor<::test_emptystruct::EmptyProtocolReceiveRequest>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::test_emptystruct::Empty, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::e, 0});
  static constexpr auto kPadding = std::make_tuple();
};

class EmptyProtocolSendAndReceiveRequest {
 private:
  struct Storage_;

 public:
  EmptyProtocolSendAndReceiveRequest(Storage_ storage) noexcept;
  EmptyProtocolSendAndReceiveRequest(::test_emptystruct::Empty e) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |EmptyProtocolSendAndReceiveRequest| only if all of its members are default constructible.
  EmptyProtocolSendAndReceiveRequest() = default;
#pragma clang diagnostic pop

  EmptyProtocolSendAndReceiveRequest(EmptyProtocolSendAndReceiveRequest&&) noexcept = default;
  EmptyProtocolSendAndReceiveRequest& operator=(EmptyProtocolSendAndReceiveRequest&&) noexcept = default;
  EmptyProtocolSendAndReceiveRequest(const EmptyProtocolSendAndReceiveRequest& other) noexcept;
  EmptyProtocolSendAndReceiveRequest& operator=(const EmptyProtocolSendAndReceiveRequest& other) noexcept;

  bool operator==(const EmptyProtocolSendAndReceiveRequest& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest, 1>::Equal(this, &other);
  }
  bool operator!=(const EmptyProtocolSendAndReceiveRequest& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest, 1>::Equal(this, &other);
  }

  const ::test_emptystruct::Empty&
  e() const {
    return storage_.e;
  }

  ::test_emptystruct::Empty& e() {
    return storage_.e;
  }

  // Setter for e.
  //

  EmptyProtocolSendAndReceiveRequest& e(::test_emptystruct::Empty value);

  EmptyProtocolSendAndReceiveRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::test_emptystruct::Empty e;
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest, 1>;
  friend struct ::fidl::internal::MemberVisitor<::test_emptystruct::EmptyProtocolSendAndReceiveRequest>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::test_emptystruct::Empty, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::e, 0});
  static constexpr auto kPadding = std::make_tuple();
};

class EmptyProtocolSendAndReceiveResponse {
 private:
  struct Storage_;

 public:
  EmptyProtocolSendAndReceiveResponse(Storage_ storage) noexcept;
  EmptyProtocolSendAndReceiveResponse(::test_emptystruct::Empty e) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |EmptyProtocolSendAndReceiveResponse| only if all of its members are default constructible.
  EmptyProtocolSendAndReceiveResponse() = default;
#pragma clang diagnostic pop

  EmptyProtocolSendAndReceiveResponse(EmptyProtocolSendAndReceiveResponse&&) noexcept = default;
  EmptyProtocolSendAndReceiveResponse& operator=(EmptyProtocolSendAndReceiveResponse&&) noexcept = default;
  EmptyProtocolSendAndReceiveResponse(const EmptyProtocolSendAndReceiveResponse& other) noexcept;
  EmptyProtocolSendAndReceiveResponse& operator=(const EmptyProtocolSendAndReceiveResponse& other) noexcept;

  bool operator==(const EmptyProtocolSendAndReceiveResponse& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse, 1>::Equal(this, &other);
  }
  bool operator!=(const EmptyProtocolSendAndReceiveResponse& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse, 1>::Equal(this, &other);
  }

  const ::test_emptystruct::Empty&
  e() const {
    return storage_.e;
  }

  ::test_emptystruct::Empty& e() {
    return storage_.e;
  }

  // Setter for e.
  //

  EmptyProtocolSendAndReceiveResponse& e(::test_emptystruct::Empty value);

  EmptyProtocolSendAndReceiveResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::test_emptystruct::Empty e;
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse, 1>;
  friend struct ::fidl::internal::MemberVisitor<::test_emptystruct::EmptyProtocolSendAndReceiveResponse>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::test_emptystruct::Empty, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::e, 0});
  static constexpr auto kPadding = std::make_tuple();
};

inline Empty::Empty(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline Empty::Empty(uint8_t __reserved) noexcept
    : storage_({.__reserved = std::move(__reserved)}) {}
inline Empty::Empty(const ::test_emptystruct::Empty& other) noexcept : ::test_emptystruct::Empty(other.CloneStorage_()) {}
inline Empty& ::test_emptystruct::Empty::operator=(const ::test_emptystruct::Empty & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline Empty::Empty(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : Empty(Storage_{
                                                                                      .__reserved = 0u,
                                                                                  }) {}
inline Empty& Empty::__reserved(uint8_t value) {
  storage_.__reserved = std::move(value);
  return *this;
}

inline EmptyProtocolSendRequest::EmptyProtocolSendRequest(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline EmptyProtocolSendRequest::EmptyProtocolSendRequest(::test_emptystruct::Empty e) noexcept
    : storage_({.e = std::move(e)}) {}
inline EmptyProtocolSendRequest::EmptyProtocolSendRequest(const ::test_emptystruct::EmptyProtocolSendRequest& other) noexcept : ::test_emptystruct::EmptyProtocolSendRequest(other.CloneStorage_()) {}
inline EmptyProtocolSendRequest& ::test_emptystruct::EmptyProtocolSendRequest::operator=(const ::test_emptystruct::EmptyProtocolSendRequest & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline EmptyProtocolSendRequest::EmptyProtocolSendRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : EmptyProtocolSendRequest(Storage_{
                                                                                                                            .e = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                        }) {}
inline EmptyProtocolSendRequest& EmptyProtocolSendRequest::e(::test_emptystruct::Empty value) {
  storage_.e = std::move(value);
  return *this;
}

inline EmptyProtocolReceiveRequest::EmptyProtocolReceiveRequest(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline EmptyProtocolReceiveRequest::EmptyProtocolReceiveRequest(::test_emptystruct::Empty e) noexcept
    : storage_({.e = std::move(e)}) {}
inline EmptyProtocolReceiveRequest::EmptyProtocolReceiveRequest(const ::test_emptystruct::EmptyProtocolReceiveRequest& other) noexcept : ::test_emptystruct::EmptyProtocolReceiveRequest(other.CloneStorage_()) {}
inline EmptyProtocolReceiveRequest& ::test_emptystruct::EmptyProtocolReceiveRequest::operator=(const ::test_emptystruct::EmptyProtocolReceiveRequest & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline EmptyProtocolReceiveRequest::EmptyProtocolReceiveRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : EmptyProtocolReceiveRequest(Storage_{
                                                                                                                                  .e = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                              }) {}
inline EmptyProtocolReceiveRequest& EmptyProtocolReceiveRequest::e(::test_emptystruct::Empty value) {
  storage_.e = std::move(value);
  return *this;
}

inline EmptyProtocolSendAndReceiveRequest::EmptyProtocolSendAndReceiveRequest(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline EmptyProtocolSendAndReceiveRequest::EmptyProtocolSendAndReceiveRequest(::test_emptystruct::Empty e) noexcept
    : storage_({.e = std::move(e)}) {}
inline EmptyProtocolSendAndReceiveRequest::EmptyProtocolSendAndReceiveRequest(const ::test_emptystruct::EmptyProtocolSendAndReceiveRequest& other) noexcept : ::test_emptystruct::EmptyProtocolSendAndReceiveRequest(other.CloneStorage_()) {}
inline EmptyProtocolSendAndReceiveRequest& ::test_emptystruct::EmptyProtocolSendAndReceiveRequest::operator=(const ::test_emptystruct::EmptyProtocolSendAndReceiveRequest & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline EmptyProtocolSendAndReceiveRequest::EmptyProtocolSendAndReceiveRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : EmptyProtocolSendAndReceiveRequest(Storage_{
                                                                                                                                                .e = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                            }) {}
inline EmptyProtocolSendAndReceiveRequest& EmptyProtocolSendAndReceiveRequest::e(::test_emptystruct::Empty value) {
  storage_.e = std::move(value);
  return *this;
}

inline EmptyProtocolSendAndReceiveResponse::EmptyProtocolSendAndReceiveResponse(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline EmptyProtocolSendAndReceiveResponse::EmptyProtocolSendAndReceiveResponse(::test_emptystruct::Empty e) noexcept
    : storage_({.e = std::move(e)}) {}
inline EmptyProtocolSendAndReceiveResponse::EmptyProtocolSendAndReceiveResponse(const ::test_emptystruct::EmptyProtocolSendAndReceiveResponse& other) noexcept : ::test_emptystruct::EmptyProtocolSendAndReceiveResponse(other.CloneStorage_()) {}
inline EmptyProtocolSendAndReceiveResponse& ::test_emptystruct::EmptyProtocolSendAndReceiveResponse::operator=(const ::test_emptystruct::EmptyProtocolSendAndReceiveResponse & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline EmptyProtocolSendAndReceiveResponse::EmptyProtocolSendAndReceiveResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : EmptyProtocolSendAndReceiveResponse(Storage_{
                                                                                                                                                  .e = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                              }) {}
inline EmptyProtocolSendAndReceiveResponse& EmptyProtocolSendAndReceiveResponse::e(::test_emptystruct::Empty value) {
  storage_.e = std::move(value);
  return *this;
}

}  // namespace test_emptystruct
namespace fidl {

template <>
struct IsFidlType<::test_emptystruct::Empty> : public std::true_type {};

template <>
struct TypeTraits<::test_emptystruct::Empty> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsStruct<::test_emptystruct::Empty> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_emptystruct::Empty, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalEmptyStructCodingTraits<::test_emptystruct::Empty> {};

template <>
struct IsFidlType<::test_emptystruct::EmptyProtocolSendRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_emptystruct::EmptyProtocolSendRequest> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsStruct<::test_emptystruct::EmptyProtocolSendRequest> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_emptystruct::EmptyProtocolSendRequest, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendRequest, 1> {};

template <>
struct IsFidlType<::test_emptystruct::EmptyProtocolReceiveRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_emptystruct::EmptyProtocolReceiveRequest> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsStruct<::test_emptystruct::EmptyProtocolReceiveRequest> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_emptystruct::EmptyProtocolReceiveRequest, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolReceiveRequest, 1> {};

template <>
struct IsFidlType<::test_emptystruct::EmptyProtocolSendAndReceiveRequest> : public std::true_type {};

template <>
struct TypeTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsStruct<::test_emptystruct::EmptyProtocolSendAndReceiveRequest> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveRequest, 1> {};

template <>
struct IsFidlType<::test_emptystruct::EmptyProtocolSendAndReceiveResponse> : public std::true_type {};

template <>
struct TypeTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsStruct<::test_emptystruct::EmptyProtocolSendAndReceiveResponse> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_emptystruct::EmptyProtocolSendAndReceiveResponse, 1> {};

#pragma clang diagnostic pop

}  // namespace fidl
