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

#pragma once

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

//
// Domain objects declarations (i.e. "natural types" in unified bindings).
//
namespace fidl {
namespace test {
namespace escaping {
class DocCommentWithQuotes;

/// "pleaseescapethisdocommentproperly"
class DocCommentWithQuotes final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t __reserved = 0u;

  static inline ::std::unique_ptr<DocCommentWithQuotes> New() {
    return ::std::make_unique<DocCommentWithQuotes>();
  }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info =
                  cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, DocCommentWithQuotes* value,
                     size_t _offset);
  zx_status_t Clone(DocCommentWithQuotes* result) const;
};

inline zx_status_t Clone(
    const ::fidl::test::escaping::DocCommentWithQuotes& _value,
    ::fidl::test::escaping::DocCommentWithQuotes* _result) {
  return _value.Clone(_result);
}

using DocCommentWithQuotesPtr = ::std::unique_ptr<DocCommentWithQuotes>;

}  // namespace escaping
}  // namespace test
template <>
struct CodingTraits<::fidl::test::escaping::DocCommentWithQuotes>
    : public EncodableCodingTraits<::fidl::test::escaping::DocCommentWithQuotes,
                                   1> {};

template <>
struct IsMemcpyCompatible<::fidl::test::escaping::DocCommentWithQuotes>
    : public internal::BoolConstant<
          !HasPadding<::fidl::test::escaping::DocCommentWithQuotes>::value &&
          IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(
    const ::fidl::test::escaping::DocCommentWithQuotes& value,
    ::fidl::test::escaping::DocCommentWithQuotes* result) {
  return ::fidl::test::escaping::Clone(value, result);
}

template <>
struct Equality<::fidl::test::escaping::DocCommentWithQuotes> {
  bool operator()(
      const ::fidl::test::escaping::DocCommentWithQuotes& _lhs,
      const ::fidl::test::escaping::DocCommentWithQuotes& _rhs) const {
    if (!::fidl::Equals(_lhs.__reserved, _rhs.__reserved)) {
      return false;
    }
    return true;
  }
};

}  // namespace fidl
