// 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 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;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
