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

#pragma once

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

#include <cinttypes>
#include <string>

#ifdef __Fuchsia__

#endif  // __Fuchsia__

namespace test_escaping {
class DocCommentWithQuotes;

extern "C" const fidl_type_t test_escaping_DocCommentWithQuotesTable;

/// "pleaseescapethisdocommentproperly"
class DocCommentWithQuotes {
 private:
  struct Storage_;

 public:
  DocCommentWithQuotes(Storage_ storage) noexcept
      : storage_(std::move(storage)) {}
  DocCommentWithQuotes(uint8_t __reserved) noexcept
      : storage_({.__reserved = std::move(__reserved)}) {}

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

  DocCommentWithQuotes(DocCommentWithQuotes&&) noexcept = default;
  DocCommentWithQuotes& operator=(DocCommentWithQuotes&&) noexcept = default;
  DocCommentWithQuotes(const DocCommentWithQuotes& other) noexcept
      : DocCommentWithQuotes(other.CloneStorage_()) {}
  DocCommentWithQuotes& operator=(const DocCommentWithQuotes& other) noexcept {
    storage_ = other.CloneStorage_();
    return *this;
  }

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

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

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

  DocCommentWithQuotes(
      ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag)
      : DocCommentWithQuotes(Storage_{
            .__reserved = 0u,
        }) {}

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

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<
      ::test_escaping::DocCommentWithQuotes, 1>;
  friend struct ::fidl::internal::MemberVisitor<
      ::test_escaping::DocCommentWithQuotes>;
  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();
};

}  // namespace test_escaping
namespace fidl {

extern "C" const fidl_type_t test_escaping_DocCommentWithQuotesTable;

template <>
struct IsFidlType<::test_escaping::DocCommentWithQuotes>
    : public std::true_type {};

template <>
struct ::fidl::internal::TypeTraits<::test_escaping::DocCommentWithQuotes>
    final {
 public:
  static constexpr const fidl_type_t* kCodingTable =
      &test_escaping_DocCommentWithQuotesTable;
};

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

}  // namespace fidl
